【发布时间】:2016-11-08 18:02:06
【问题描述】:
我需要为较长的叙述中的多个句子生成唯一的 ID(其中多个用户可以同时在不同的机器上执行相同的操作)。
我考虑过使用new Date().getTime()(并且可能连接username),但由于在循环遍历句子时生成了id,我发现创建了重复项(因为生成可能发生在同一毫秒)。
所以我目前正在玩:
var random1 = Math.floor((Math.random() * 10000) + 1).toString(36);
var random2 = Math.floor((Math.random() * 10000) + 1);
var random3 = Math.floor((Math.random() * 10000) + 1);
var id = random1 + random2 + random3;
// generates things like:
// 1h754278042
// 58o83798349
// 3ls28055962
我想到了(诚然,作为一个没有过多思考独特/随机/加密问题的人),加入三个随机数可能不再比一个随机数更随机?
生成和连接 3 个 Math.random() 值是否比 1 个 Math.random() 值更随机?
这个答案 (https://security.stackexchange.com/a/124003) 指出:
如果随机生成器真的产生随机数据,那么它不会 问题。
但我不确定这如何适用于 Math.random() 的使用。
编辑:
场景是 web 上的客户端,而不是为了安全,只是为了确保每个句子在数据库中都有一个唯一的 id。
编辑:
我最终实现了:
function guid() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000)
.toString(16)
.substring(1);
}
return s4() + s4() + '-' + s4() + '-' + s4() + '-' +
s4() + '-' + s4() + s4() + s4();
}
var id = guid();
发件人:https://stackoverflow.com/a/105074/1063287
另见对该答案的评论:
实际上,RFC 允许从随机创建的 UUID 数字。您只需旋转几位即可将其识别为 这样的。请参阅第 4.4 节。从 Truly 创建 UUID 的算法 随机数或伪随机数:rfc-archive.org/getrfc.php?rfc=4122
【问题讨论】:
-
这是否在 Web 上运行客户端,您是否打算将其用于安全性?
-
@user1063287
Math.random()目的不是为了提供唯一性 -
它不是“更随机”,但它增加了 id 空间,因此降低了冲突的风险,但你不能保证不会有这个。
-
JS 4 now supports guid 用于唯一性
标签: javascript random