为什么javascript中的`btoa`编码适用于20位数字串而不是20位数字?

时间:2016-03-23 07:18:36

标签: javascript hash encoding

考虑以下btoa输出

btoa(99999999999999999999)
"MTAwMDAwMDAwMDAwMDAwMDAwMDAw"

btoa(99999999999999999998)
"MTAwMDAwMDAwMDAwMDAwMDAwMDAw"

btoa("99999999999999999998")
"OTk5OTk5OTk5OTk5OTk5OTk5OTg="

btoa("99999999999999999999")
"OTk5OTk5OTk5OTk5OTk5OTk5OTk="

我们发现btoa无法为20位int编码唯一哈希,但能够编码20位string。这是为什么?

我的原始猜测是,由于btoa是基础64,因此它只能编码小于基数64的内容,但为什么它能够编码20位{{1}相反?

此外,btoa似乎无法编码string小于int 9223372036854775807

2^63

1 个答案:

答案 0 :(得分:6)

由于浮点不精确。请记住,JavaScript在某些计算过程中暂时没有整数;所有JavaScript编号都是IEEE-754双精度浮点数。 console.log(99999999999999999999); 不是IEEE-754数字中的安全整数值,事实上如果你这样做:

9007199254740991

......你会看到

100000000000000000000

最大安全整数(例如,不受浮点不精确影响的整数)为btoa

由于btoa("99999999999999999999") => OTk5OTk5OTk5OTk5OTk5OTk5OTk= 接受字符串(当您传递一个数字时,数字只会转换为字符串),只需在您的值周围添加引号:

{{1}}

当然,如果该值是数学计算的结果,则无法执行此操作。您必须更改计算如此大数字的任何内容,因为它们超出了数字类型的精确范围。