javascript - 为 cookie key 取一个随机指数值

标签 javascript string random pow floor

用这样的代码能得到长度为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/

相关文章:

Java-正则表达式来分割

c - get_string() 返回什么?

c++ - 均匀实数分布的范围限制是多少?

javascript - plupload - 上传按钮只有在以编程方式触发点击时才有效

javascript - React Native panresponder 元素可点击?

javascript - AngularJS 递归模板渲染

javascript - React Local Storage 和 Service Worker(重新上线时发送数据

mysql - SQL 订单字符串作为数字

c# - 如何在 Azure 辅助角色中生成安全随机数?

algorithm - 从 [0 :n) 中均匀采样 k 个整数