用这样的代码能得到长度为17的字符串吗? 我们将 cookie 保存在客户端的浏览器中,然后从该浏览器中获取它。
function getPartnerVisitorId() {
var pvid = cookies.get('pvid') || Math.floor(Math.random() * Math.pow(10, 15)).toString();
cookies.setOnRoot('pvid', pvid, 365 * 24 * 60 * 60);
return pvid;
};
我们认为“pvid”的最大长度应为 16 位数字,但有时(大约 5% 的 cookie)我们得到该 cookie 的 17 位长度。
我们还注意到所有奇怪的 cookie 都是偶数,其中大多数 (75%) 的最后一位数字为零
最佳答案
您要处理的问题必须符合 IEEE 754 float 的性质 - JavaScript 中用于保存 Number
的类型,Java 中用于保存 double
的类型,以及C等。这些数字以一种科学记数法的形式存储,形式为
[+/-] 1.[一些值] * 2^[一些其他值]
。
这导致您得到大约 15 个有效的小数位,这些数字特别擅长表达 2 的幂。
通过将 Math.random()
乘以 Math.pow(10,15)
,您会遇到此方案的两个问题:
- 你的数字用完了,因此 chop 了底部的最后几位(因此你的数字总是偶数)
- 您试图表示 10 的幂,但它并不总是准确(因此您有时会得到 17 位数字的 key )。
要解决这些问题并获得所需的恒定长度随 secret 钥,请执行两件事:
- 将
Math.random()
乘以Math.pow(2,x)
(其中x
是您尝试寻找的数字正确的长度)- 2^任何东西都可以用 float 准确地表示。 - 在
toString()
方法中,插入一个整数参数,它是 2 的幂(例如 8 或 16)- 这将导致数字被转换为具有基数的字符串-8 或 base-16 数字系统。这将防止可变长度 key 并防止舍入。
var pvid = cookies.get('pvid') || Math.floor(Math.random() * Math.pow(8, 15)).toString(8);
关于javascript - 为 cookie key 取一个随机指数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36068526/