【问题标题】:uniqid() in javascript/jquery?javascript / jquery中的uniqid()?
【发布时间】:2011-06-19 19:59:06
【问题描述】:

这个函数在javascript中的等价物是什么:

http://php.net/manual/en/function.uniqid.php

基本上我需要生成一个随机 ID,如下所示:a4245f54345 并以字母字符开头(因此我可以将其用作 CSS id)

【问题讨论】:

  • 我不会将其作为重复项关闭,因为 php 的 uniqid 似乎没有创建 GUID(尽管这是您所期望的),但也许您仍然可以找到一些在这里帮助:stackoverflow.com/questions/105034/…
  • 你需要它是随机的,还是你可以简单地使用一个顺序计数器?即“a1”、“a2”等...

标签: javascript jquery uniqueidentifier phpjs


【解决方案1】:

真正的问题是,您是否需要 UUID 符合 RFC 4122?您的问题似乎表明您不这样做,因此仅基于 Math.random() 创建一个函数来生成这样的 ID 并不难。另外它会比phpJS实现快很多。

【讨论】:

  • 但是什么是符合 RFC 4122 的?
  • @DylannCordel:公平点,但这里没有建议任何其他策略。 PHP uniqid() 方法本质上等同于 microtime(),并且任何在浏览器或(负载平衡、多实例)Web 服务器上运行的纯算法 uuid 生成器都将有可能发生冲突——除非命名空间-by-server(显然不是询问者的意图)或针对集中式 guid 服务进行验证。他的 1 个字母 + 10 个字母数字方案产生了 95 quintillion 或大约 56 位熵的空间。我不会太担心碰撞。
【解决方案2】:

试试这个(在 php 中工作)。

$prefix = chr(rand(97,121));  
$uniqid =  $prefix.uniqid(); // $uniqid = uniqid($prefix);

试试这个 JavaScript::

var n = Math.floor(Math.random() * 11);
var k = Math.floor(Math.random() * 1000000);
var m = String.fromCharCode(n) + k;

【讨论】:

  • 问题是要求一个 JavaScript 函数。
  • 这个 Java 脚本代码不准确(不确定总是按字母顺序排列)。但是您可以根据自己的要求对代码进行一些更改。
  • 这不是唯一的,因此不等同于 php uniqid 函数
【解决方案3】:
<html>
<head>
<script type="text/javascript">
function generateSerial(len) {
    var chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
    var string_length = 10;
    var randomstring = '';

    for (var x=0;x<string_length;x++) {

        var letterOrNumber = Math.floor(Math.random() * 2);
        if (letterOrNumber == 0) {
            var newNum = Math.floor(Math.random() * 9);
            randomstring += newNum;
        } else {
            var rnum = Math.floor(Math.random() * chars.length);
            randomstring += chars.substring(rnum,rnum+1);
        }

    }
    alert(randomstring);
}
generateSerial(8);
</script>
</head>
<body>

</body>
</html>

这有点令人费解,但我确信你明白了要点!
示例: http://jsfiddle.net/Ng4tB/

【讨论】:

    【解决方案4】:

    这里的所有答案(phpjs 除外)都不会生成唯一 ID,因为它是基于随机的。随机不是唯一的!

    一个简单的解决方案:

    window.unique_id_counter = 0 ;
    var uniqid = function(){
        var id ;
        while(true){
            window.unique_id_counter++ ;
            id = 'uids_myproject_' + window.unique_id_counter ;
            if(!document.getElementById(id)){
                /*you can remove the loop and getElementById check if you 
                  are sure that noone use your prefix and ids with this 
                  prefix are only generated with this function.*/
                return id ;
            }
        }
    }
    

    如果需要,添加动态前缀很容易。只需将unique_id_counter 更改为存储每个前缀计数器的数组即可。

    【讨论】:

      【解决方案5】:

      我一直在用这个...

      我完全按照 PHP 的方式使用它。两者都返回相同的结果。

      function uniqid(prefix = "", random = false) {
          const sec = Date.now() * 1000 + Math.random() * 1000;
          const id = sec.toString(16).replace(/\./g, "").padEnd(14, "0");
          return `${prefix}${id}${random ? `.${Math.trunc(Math.random() * 100000000)}`:""}`;
      };
      

      【讨论】:

      • 完美的解决方案,完全按照 OP 的要求。这应该是公认的答案。
      • 参数 a 和 b 的作用是什么?
      • 参数a 是一个前缀,参数b 将在末尾添加一个随机数以帮助避免冲突。
      【解决方案6】:
      function uniqId(prefix) {
          if (window.performance) {
              var s = performance.timing.navigationStart;
              var n = performance.now();
              var base = Math.floor((s + Math.floor(n))/1000);
          } else {
              var n = new Date().getTime();
              var base = Math.floor(n/1000);
          }   
          var ext = Math.floor(n%1000*1000);
          var now = ("00000000"+base.toString(16)).slice(-8)+("000000"+ext.toString(16)).slice(-5);
          if (now <= window.my_las_uid) {
              now = (parseInt(window.my_las_uid?window.my_las_uid:now, 16)+1).toString(16);
          }
          window.my_las_uid = now;
          return (prefix?prefix:'')+now;
      }
      

      它是根据与 PHP 的 uniqId()“相同”的原则生成的 - 特别是以微秒为单位的编码时间。

      【讨论】:

      • 谢谢!我写了一个测试来比较你的 Javascript 函数和 PHP uniqid() 的输出。我发现你的回答更准确。
      【解决方案7】:

      Underscore.js 有一个uniqueid() 方法
      https://underscorejs.org/#uniqueId

      _.uniqueId([prefix])
      为需要的客户端模型或 DOM 元素生成一个全局唯一的 id。如果传递了前缀,则将 id 附加到它。

      _.uniqueId('contact_');  
      => 'contact_104'
      

      【讨论】:

        【解决方案8】:

        找到这个:

        https://github.com/makeable/uuid-v4.js/blob/master/uuid-v4.js

        并稍作修改:

        function uniqid(length){
          var dec2hex = [];
          for (var i=0; i<=15; i++) {
            dec2hex[i] = i.toString(16);
          }
        
          var uuid = '';
          for (var i=1; i<=36; i++) {
            if (i===9 || i===14 || i===19 || i===24) {
              uuid += '-';
            } else if (i===15) {
              uuid += 4;
            } else if (i===20) {
              uuid += dec2hex[(Math.random()*4|0 + 8)];
            } else {
              uuid += dec2hex[(Math.random()*16|0)];
            }
          }
        
          if(length) uuid = uuid.substring(0,length);
          return uuid;
        }
        

        效果很好。

        【讨论】:

          猜你喜欢
          • 2011-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多