【问题标题】:jQuery .now() not uniquejQuery .now() 不是唯一的
【发布时间】:2013-12-11 15:47:49
【问题描述】:

我有一个jsfiddle

obj = {};
obj[0] = 'hej';
obj[1] = 'hopp';

$.each( obj, function( key, value ) {
    console.log($.now());
});

$.now() 在控制台中是同一个数字。

如何生成唯一编号?

【问题讨论】:

  • 所以你的电脑太快了?
  • 如果您需要一个真正唯一的数字,请创建一个包含数字的 var 并将其递增。没必要花哨。如果您需要它在整个应用程序中是唯一的并且不想要全局计数变量,您甚至可以在函数后面抽象它。
  • 你创建一个对象,然后给它01的键。对我来说听起来更像是一个数组。
  • 您需要一个唯一的数字或标识符(例如 GUID)?如果第二次检查stackoverflow.com/questions/105034/…
  • @KevinB 简单而且效果很好!

标签: javascript jquery random unique


【解决方案1】:

您可以有一个针对每个对象递增的计数器。然后,您可以将此计数器添加到 $.now() 以确保它是唯一的:

obj = {};
obj[0] = 'hej';
obj[1] = 'hopp';
counter=1;

$.each( obj, function( key, value ) {
    console.log($.now() + counter);
    counter+=1;
});

【讨论】:

    【解决方案2】:

    jQuery.now() 不应该给你一个唯一的数字,只是一个“代表当前时间的数字”(http://api.jquery.com/jQuery.now/)。更具体地说,“自 1970 年 1 月 1 日 00:00:00 UTC 以来的毫秒数”(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime)。

    生成唯一标识符的最简单方法取决于标识符必须唯一的范围。

    1:如果标识符只需要在函数范围内是唯一的,那么 SteveP 建议的计数器可能会做得最好。

    2:如果标识符需要在您的应用程序范围内是唯一的 - 而您无法跟踪分配的标识符(如 1 中所示) - 您的工作会更加困难。 在实际应用中,可以通过将时间戳与随机数相结合来解决这种情况,类似于

    var identifier = $.now() + "_" + Math.round(Math.random() * 1e10)
    

    这种方法不能保证 identifier 的真正唯一性,因为 Math.round(Math.random() * 1e10) 可以在一毫秒内两次返回相同的值。根据你生成这样一个字符串的频率,你仍然不太可能两次得到相同的字符串。

    3:如果你的目标是“跨越时空的独特性”,你可以从http://www.ietf.org/rfc/rfc4122.txt获得灵感

    需要注意的是,像Create GUID / UUID in JavaScript? 这样的纯 Javascript 实现也只能使用随机数,因此不会生成 真正 唯一标识符。对于跨空间和时间的真正唯一标识符,必须将真正唯一元素(例如mac地址)用作标识符的一部分。

    【讨论】:

      【解决方案3】:

      引用jquery api:

      $.now() 方法是 表达式(新日期).getTime()。

      所以你基本上使用new Date().getTime()。然而 getTime() 并不准确......来自this article 的有趣引用:

      实际上,这些浏览器只是在更新它们的内部 getTime 每 15 毫秒表示一次。这意味着如果您尝试 查询更新的时间,它总是向下舍入到最后 计时器更新的时间(平均而言,大约是 7.5 毫秒前)。

      简而言之:getTime() 不是那么准确(在某些浏览器中)。

      当你需要一个随机数时(就像你一样),使用:

      var randomVal = Math.random(); // e.g. 0.6137274974025786
      var randomValI = Math.round(Math.random()*100000000000000000)  // e.g. 6137274974025786
      

      当您需要更正式的“guid”时,请使用this

      function createGUID() {
          function S4() {
              return (((1+Math.random())*0x10000)|0).toString(16).substring(1); 
          }
      
          // then to call it, plus stitch in '4' in the third group
          return (S4() + S4() + "-" + S4() + "-4" + S4().substr(0,3) + "-" + S4() + "-" + S4() + S4() + S4()).toLowerCase();
      }
      var guid = createGUID();
      

      【讨论】:

        【解决方案4】:

        当然$.now 只是显示当前时间戳。有一个随机数使用Math.random()

        【讨论】:

        • 是的,他可以为此使用key。在数组中它将是唯一的。
        猜你喜欢
        • 2012-08-19
        • 1970-01-01
        • 2018-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多