我需要在浏览器中生成唯一的ID。目前,我正在使用它:
Math.floor(Math.random() * 10000000000000001)
我想使用当前的UNIX时间((new Date).getTime()
),但我担心如果两个客户端同时在完全生成id,它们将不会唯一的。
我可以使用当前的UNIX时间(我想这样,因为这种方式会存储更多信息)?如果没有,最好的方法是什么(可能是UNIX时间+ 2个随机数字?)
答案 0 :(得分:16)
您可以使用以下链接创建GUID:
http://softwareas.com/guid0-a-javascript-guid-generator
Create GUID / UUID in JavaScript?
这将最大化你“独特性”的机会。
或者,如果它是一个安全页面,您可以将日期/时间与用户名连接起来,以防止同时生成多个值。
答案 1 :(得分:9)
https://github.com/broofa/node-uuid根据时间戳或随机#提供符合RFC的UUID。单个文件没有依赖关系,支持时间戳或随机的基于#UU的UUID,如果可用,则使用本机API获取加密质量的随机数,以及其他好东西。
答案 2 :(得分:4)
在现代浏览器中,您可以使用crypto:
var array = new Uint32Array(1);
window.crypto.getRandomValues(array);
console.log(array);
答案 3 :(得分:1)
var c = 1;
function cuniq() {
var d = new Date(),
m = d.getMilliseconds() + "",
u = ++d + m + (++c === 10000 ? (c = 1) : c);
return u;
}
答案 4 :(得分:1)
这是我生成guid的javascript代码。它可以快速进行十六进制映射并且非常高效:
AuthenticationContext.prototype._guid = function () {
// RFC4122: The version 4 UUID is meant for generating UUIDs from truly-random or
// pseudo-random numbers.
// The algorithm is as follows:
// Set the two most significant bits (bits 6 and 7) of the
// clock_seq_hi_and_reserved to zero and one, respectively.
// Set the four most significant bits (bits 12 through 15) of the
// time_hi_and_version field to the 4-bit version number from
// Section 4.1.3. Version4
// Set all the other bits to randomly (or pseudo-randomly) chosen
// values.
// UUID = time-low "-" time-mid "-"time-high-and-version "-"clock-seq-reserved and low(2hexOctet)"-" node
// time-low = 4hexOctet
// time-mid = 2hexOctet
// time-high-and-version = 2hexOctet
// clock-seq-and-reserved = hexOctet:
// clock-seq-low = hexOctet
// node = 6hexOctet
// Format: xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
// y could be 1000, 1001, 1010, 1011 since most significant two bits needs to be 10
// y values are 8, 9, A, B
var guidHolder = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx';
var hex = '0123456789abcdef';
var r = 0;
var guidResponse = "";
for (var i = 0; i < 36; i++) {
if (guidHolder[i] !== '-' && guidHolder[i] !== '4') {
// each x and y needs to be random
r = Math.random() * 16 | 0;
}
if (guidHolder[i] === 'x') {
guidResponse += hex[r];
} else if (guidHolder[i] === 'y') {
// clock-seq-and-reserved first hex is filtered and remaining hex values are random
r &= 0x3; // bit and with 0011 to set pos 2 to zero ?0??
r |= 0x8; // set pos 3 to 1 as 1???
guidResponse += hex[r];
} else {
guidResponse += guidHolder[i];
}
}
return guidResponse;
};
答案 5 :(得分:1)
有两种方法可以实现这一目标
js const id = Date.now().toString()
虽然这不能保证唯一性(当您在1ms内创建多个对象时),但是这将在实际的水平上起作用,因为通常不需要很长时间才能将客户端上的对象发送到真实服务器。
const { randomBytes } = require("crypto");
// 32 Characters
const id = randomBytes(16).toString("hex");
它的工作方式类似于uuid4,而无需添加外部库(假设您有时可以访问NodeJ)
答案 6 :(得分:0)
您始终可以针对集合中的现有ID进行测试,以递归地接受或拒绝生成的随机数。
例如:
const randomID = function(){
let id = Math.floor(Math.random() * 10000000000000001) + new Date();
if (idObjectArray.contains(id)) {
randomID;
} else {
idObjectArray.push(id);
}
};
此示例假定您只是将id推入一维数组,但您明白了。鉴于随机数与日期的唯一性,应该不会发生太多冲突,因此应该有效率。