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:公平点,但这里没有建议任何其他策略。 PHPuniqid()
方法本质上等同于 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()?的主要内容,如果未能解决你的问题,请参考以下文章