0
0

Hashids fail when encrypting large numbers

C.C. 发表于 2014年09月01日 15:33 | Hits: 2538

使用hashids算法去encode一个大数,比如3945448269169105809的时候,就会发现这个问题。原因很简单,这个算法的初始版本是基于javascript实现的,而问题就出在该语言上。

javascript里:

10000000000000000 === 10000000000000001  

1.0000000000000001 === 1  

都是同一个道理

ECMA-262 Spec里说

The type Number is a set of values representing numbers. In ECMAScript, the set of values represents the double-precision 64-bit format IEEE 754 values including the special "Not-a-Number" (NaN) values, positive infinity, and negative infinity.

而根据IEEE 754对64-bit Double类型的格式定义,有效位是52位,也就是说javascript的Number类型最大的Integer值是2^53-1(即有效位全部都是1),而这个数也是Number.MAX_SAFE_INTEGER的值。但是2^53也是没问题的,因为这时候左移1个bit。但是2^53+1就有问题了,是无法表示出这这个数的,所以2^53之后的下一个数,是2^53+2

这样可以验证:

Math.pow(2, 53) == Math.pow(2, 53) + 1  
>> true

详细验证

var n = 1000;  
var from = 10000000000000000;  
var to = from + n;  
var i = from;  
var missing = [];  
while (i < to) {  
  var incr = 1;
  while (i === i+incr) {
    missing.push(i+" + "+incr);
    incr ++;
  }
  i += incr;
}
console.log(missing);  
console.log(missing.length+" values are missing.");  
// logs: 250 values are missing.

原文链接: http://onlyvc.us/hashids-fail-when-encrypting-large-numbers/

0     0

我要给这篇文章打分:

可以不填写评论, 而只是打分. 如果发表评论, 你可以给的分值是-5到+5, 否则, 你只能评-1, +1两种分数. 你的评论可能需要审核.

评价列表(0)