使用javascript时间创建唯一的数字

Nic*_*rie 90 javascript time numbers unique

我需要使用javascript动态生成唯一的ID号.在过去,我通过使用时间创建数字来完成此操作.该数字将由四位数年份,两位数月份,两位数日期,两位数小时,两位数分钟,两位数秒和三位数毫秒组成.所以它看起来像这样:20111104103912732 ......这将为我的目的提供足够的确定性.

我做了这个已经有一段时间了,而且我已经没有代码了.任何人都有代码来执行此操作,或者有更好的建议来生成唯一ID?

小智 102

更好的方法是:

new Date().valueOf();
Run Code Online (Sandbox Code Playgroud)

代替

new Date().getUTCMilliseconds();
Run Code Online (Sandbox Code Playgroud)

valueOf()是"最有可能"的唯一数字. http://www.w3schools.com/jsref/jsref_valueof_date.asp.

  • 它不是唯一的数字.毫秒不够精细,不能被认为是唯一的. (19认同)
  • @ItzikBenHutta 得到了相同值的 3 倍。使用多核CPU,可能与线程存在竞争条件。 (3认同)
  • 这应该是被接受的响应。 (2认同)
  • 或者只是`+ new Date()` (2认同)

Mar*_*c B 62

如果你只想要一个唯一的数字,那么

var timestamp = new Date().getUTCMilliseconds();
Run Code Online (Sandbox Code Playgroud)

会给你一个简单的数字.但是,如果您需要可读的版本,那么您需要进行一些处理:

var now = new Date();

timestamp = now.getFullYear().toString(); // 2011
timestamp += (now.getMonth < 9 ? '0' : '') + now.getMonth().toString(); // JS months are 0-based, so +1 and pad with 0's
timestamp += ((now.getDate < 10) ? '0' : '') + now.getDate().toString(); // pad with a 0
... etc... with .getHours(), getMinutes(), getSeconds(), getMilliseconds()
Run Code Online (Sandbox Code Playgroud)

  • 时间戳应该是`新日期()的getTime();``的date.getUTCMilliseconds()`返回自1月1日1970年(正常时间戳)0和999`date.getTime()`返回毫秒之间的数字.http://www.w3schools.com/jsref/jsref_obj_date.asp (59认同)
  • -1,因为问题是关于*unique*number.应完全省略第一个代码块. (7认同)
  • getUTCMilliseconds`getUTCMilliseconds()返回的值是0到999之间的整数.这是唯一ID的最糟糕的想法,应删除第一段. (6认同)
  • @Áxel:我没有说它是独特的,我说它是"独特的".当然使用生成时间戳的客户端将生成欺骗. (3认同)

Mar*_*oni 51

创建一个您可以非常肯定的数字的最短方式在您可以想到的众多单独实例中是唯一的

Date.now() + Math.random()
Run Code Online (Sandbox Code Playgroud)

如果函数调用存在1毫秒的差异,则100%保证生成不同的数字.对于相同毫秒内的函数调用,如果您在同一毫秒内创建超过几百万个数字,那么您应该开始担心,这不太可能.

有关在相同毫秒内获得重复数字的概率的更多信息,请参阅/sf/answers/1975464991/

  • 恕我直言,最好的解决方案是使用 `Math.floor(Date.now() * Math.random())`。如果在循环中仅使用 Date.now() ,则确实会出现重复项,但 Math.random() 使其独一无二。 (7认同)
  • 此外,如果你想保留随机数的所有位,你可以单独生成它们并合并为字符串:new Date().valueOf().toString(36)+ Math.random().toString(36).substr (2)这将给你一个19个字符的字母数字字符串,这是一个相当数量的熵.尽管其中一半是可预测的. (4认同)
  • 这应该是公认的答案,因为在尝试其他更高投票的答案时,从异步函数调用时,我连续获得了 2 倍甚至 3 倍的相同值。这似乎为标准的 8 核 CPU 提供了足够的随机性,可以完全在同一时刻生成 8 个唯一的字符串,足以让我使用。 (4认同)
  • 我检查了 100 万项循环,它通过了。对我来说非常独特:https://stackblitz.com/edit/js-unique-id (3认同)

Aug*_*aas 21

这可以通过以下代码简单地实现:

var date = new Date();
var components = [
    date.getYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds()
];

var id = components.join("");
Run Code Online (Sandbox Code Playgroud)

  • 如果在同一毫秒内调用两次该怎么办? (6认同)
  • 确实,但对于 op 来说是可以的:“这将为我的目的提供足够的唯一数字确定性。” (2认同)

Ste*_*hon 16

这比创建Date实例更快,使用更少的代码并始终生成唯一的数字(本地):

function uniqueNumber() {
    var date = Date.now();

    // If created at same millisecond as previous
    if (date <= uniqueNumber.previous) {
        date = ++uniqueNumber.previous;
    } else {
        uniqueNumber.previous = date;
    }

    return date;
}

uniqueNumber.previous = 0;
Run Code Online (Sandbox Code Playgroud)

jsfiddle:http://jsfiddle.net/j8aLocan/

我已经在Bower和npm上发布了这个:https://github.com/stevenvachon/unique-number

您还可以使用更精细的内容,例如cuid,puidshortid来生成非数字.

  • 努力工作,而不是试图挑选你的答案......但是这个新的解决方案实际上并没有解决"在同一毫秒内创建的多个id"问题,因为,你知道..它是javascript,在客户端.如果其他用户在同一毫秒内创建了一个数字,则不会反映在"其他"用户的uniqueNumber.previous中.除非你将它存储在某个地方的服务器上并检查其独特性......否则这样的纯粹基于js的解决方案就无法_certain_创建一个唯一的数字. (2认同)

fru*_*ert 15

这就是我想要的东西,当我想要比一堆数字更小的东西时 - 改变基础.

var uid = (new Date().getTime()).toString(36)
Run Code Online (Sandbox Code Playgroud)


Mar*_*Cen 14

到 2024 年,您可以使用浏览器内的Crypto API生成加密的强随机值。

function getRandomNumbers() {
  const typedArray = new Uint8Array(10);
  const randomValues = window.crypto.getRandomValues(typedArray);
  return randomValues.join('');
}

console.log(getRandomNumbers());
// 1857488137147725264738

Run Code Online (Sandbox Code Playgroud)

function getRandomNumbers() {
  const typedArray = new Uint8Array(10);
  const randomValues = window.crypto.getRandomValues(typedArray);
  return randomValues.join('');
}

console.log(getRandomNumbers());
Run Code Online (Sandbox Code Playgroud)

所有主要浏览器都支持Uint8Array构造函数和Crypto.getRandomValues ,包括 IE11


小智 12

我用

Math.floor(new Date().valueOf() * Math.random())
Run Code Online (Sandbox Code Playgroud)

因此,如果代码同时被解雇,那么随机数也将是相同的.

  • 我的意思是,它比简单地执行“Math.random()”更好吗? (2认同)

Fac*_*alm 8

这应该做:

var uniqueNumber = new Date().getTime(); // milliseconds since 1st Jan. 1970
Run Code Online (Sandbox Code Playgroud)


Raj*_* Rj 7

如果你想在几毫秒后得到一个唯一的数字然后使用Date.now(),如果你想在 a 内使用它for loop然后Date.now() and Math.random()一起使用

for 循环中的唯一编号

function getUniqueID(){
    for(var i = 0; i< 5; i++)
      console.log(Date.now() + ( (Math.random()*100000).toFixed()))
}
getUniqueID()
Run Code Online (Sandbox Code Playgroud)

输出::所有数字都是唯一的

15598251485988384 155982514859810330 155982514859860737 155982514859882244 155982514859883316

唯一编号没有 Math.random()

function getUniqueID(){
        for(var i = 0; i< 5; i++)
          console.log(Date.now())
    }
    getUniqueID()
Run Code Online (Sandbox Code Playgroud)

输出::重复数字

1559825328327 1559825328327 1559825328327 1559825328328 1559825328328


aba*_*ber 5

通过在线调查,我想出了以下对象,它为每个会话创建一个唯一的 ID:

        window.mwUnique ={
        prevTimeId : 0,
        prevUniqueId : 0,
        getUniqueID : function(){
            try {
                var d=new Date();
                var newUniqueId = d.getTime();
                if (newUniqueId == mwUnique.prevTimeId)
                    mwUnique.prevUniqueId = mwUnique.prevUniqueId + 1;
                else {
                    mwUnique.prevTimeId = newUniqueId;
                    mwUnique.prevUniqueId = 0;
                }
                newUniqueId = newUniqueId + '' + mwUnique.prevUniqueId;
                return newUniqueId;                     
            }
            catch(e) {
                mwTool.logError('mwUnique.getUniqueID error:' + e.message + '.');
            }
        }            
    }
Run Code Online (Sandbox Code Playgroud)

这可能对某些人有帮助。

干杯

安德鲁