javascript / jquery中的uniqid()?

Posted

技术标签:

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

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

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

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

【问题讨论】:

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

效果很好。

【讨论】:

以上是关于javascript / jquery中的uniqid()?的主要内容,如果未能解决你的问题,请参考以下文章

Jquery 中的$(this) 和javascript中的this

参考 Jquery 中的 Javascript 文件

linux uniq 命令

Javascript/jQuery 中的范围? [复制]

uniq

javascript / jquery中的uniqid()?