我需要使用 javascript 动态生成唯一的 ID 号。过去,我通过使用时间创建一个数字来做到这一点。该数字将由四位数的年份、两位数的月份、两位数的日、两位数的小时、两位数的分钟、两位数的秒和三位位数的毫秒组成。所以它看起来像这样: 20111104103912732 ...这将为我的目的提供足够的唯一数字的确定性。
我已经有一段时间没有这样做了,而且我没有代码了。任何人都有执行此操作的代码,或者有更好的建议来生成唯一 ID?
我需要使用 javascript 动态生成唯一的 ID 号。过去,我通过使用时间创建一个数字来做到这一点。该数字将由四位数的年份、两位数的月份、两位数的日、两位数的小时、两位数的分钟、两位数的秒和三位位数的毫秒组成。所以它看起来像这样: 20111104103912732 ...这将为我的目的提供足够的唯一数字的确定性。
我已经有一段时间没有这样做了,而且我没有代码了。任何人都有执行此操作的代码,或者有更好的建议来生成唯一 ID?
更好的方法是:
new Date().valueOf();
代替
new Date().getUTCMilliseconds();
valueOf()是“最有可能”的唯一数字。 http://www.w3schools.com/jsref/jsref_valueof_date.asp。
创建一个您可以确定的数字的最短方法在您能想到的尽可能多的独立实例中是唯一的
Date.now() + Math.random()
如果函数调用有 1 毫秒的差异,则100% 保证生成不同的数字。对于同一毫秒内的函数调用,如果您在同一毫秒内创建超过几百万个数字,您应该开始担心,这不太可能。
有关在同一毫秒内获得重复数字的概率的更多信息,请参阅https://stackoverflow.com/a/28220928/4617597
如果你只想要一个独特的数字,那么
var timestamp = new Date().getUTCMilliseconds();
会给你一个简单的数字。但是,如果您需要可读版本,则需要进行一些处理:
var now = new Date();
timestamp = now.getFullYear().toString(); // 2011
timestamp += (now.getMonth < 9 ? '0' : '') + now.getMonth().toString(); // JS months are 0-based, so +1 and pad with 0's
timestamp += ((now.getDate < 10) ? '0' : '') + now.getDate().toString(); // pad with a 0
... etc... with .getHours(), getMinutes(), getSeconds(), getMilliseconds()
这可以通过以下代码简单地实现:
var date = new Date();
var components = [
date.getYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds(),
date.getMilliseconds()
];
var id = components.join("");
当我想要比一堆数字更小的东西时,我会这样做 - 改变基数。
var uid = (new Date().getTime()).toString(36)