考虑以下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
答案 0 :(得分:6)
由于浮点不精确。请记住,JavaScript在某些计算过程中暂时没有整数;所有JavaScript编号都是IEEE-754双精度浮点数。 console.log(99999999999999999999);
不是IEEE-754数字中的安全整数值,事实上如果你这样做:
9007199254740991
......你会看到
100000000000000000000
最大安全整数(例如,不受浮点不精确影响的整数)为btoa
。
由于btoa("99999999999999999999")
=> OTk5OTk5OTk5OTk5OTk5OTk5OTk=
接受字符串(当您传递一个数字时,数字只会转换为字符串),只需在您的值周围添加引号:
{{1}}
当然,如果该值是数学计算的结果,则无法执行此操作。您必须更改计算如此大数字的任何内容,因为它们超出了数字类型的精确范围。