【问题标题】:Is this a unique id generator reliable to be always unique?这是一个唯一的 id 生成器可靠地始终是唯一的吗?
【发布时间】:2019-02-08 03:25:13
【问题描述】:

想知道这个函数是否可靠且始终是唯一的,还想知道我应该在本地还是在服务器上执行此操作?

 function IDGenerator() {

     this.length = 8;
     this.timestamp = +new Date;

     var _getRandomInt = function( min, max ) {
        return Math.floor( Math.random() * ( max - min + 1 ) ) + min;
     }

     this.generate = function() {
         var ts = this.timestamp.toString();
         var parts = ts.split( "" ).reverse();
         var id = "";

         for( var i = 0; i < this.length; ++i ) {
            var index = _getRandomInt( 0, parts.length - 1 );
            id += parts[index];  
         }

         return id;
     }


 }

【问题讨论】:

  • 当您的输入和输出是有限集时,从技术上讲不可能始终唯一。
  • 一个简单的计数器会减少碰撞的风险...你能定义这个函数的范围吗?它是否应该在每个文档的生命周期内或在任何时候对每个用户都是唯一的?

标签: javascript


【解决方案1】:

因为在同一台机器上不能同时生成两个时间戳。

由同一台机器生成并在同一台机器内生成 - 仅时间戳 - 保证是唯一的。

【讨论】:

  • 但是他们没有按原样使用时间戳,他们确实使用时间戳中找到的每个数字作为 Math.random() 的上限生成一个伪随机字符串(因为我不知道是什么原因...)
【解决方案2】:

仅使用 Math.random 的问题在于它并不是真正随机的。另一方面,仅使用日期时间戳的问题在于,根据方法执行的速度,值可能会重复。

我在许多应用程序中都使用了它,效果很好。这很简单,而且我从未遇到过由于重复值而引起的冲突:

function uid() {
    return (Date.now().toString(36) + Math.random().toString(36).substr(2, 9));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 2012-05-20
    • 2017-09-19
    • 2013-04-11
    • 1970-01-01
    • 2010-09-11
    相关资源
    最近更新 更多