JavaScript 时间戳数字并不唯一

5
我需要生成一个唯一的数字以在我的代码中使用。我使用:
var id = new Date().valueOf()

我知道上面的代码返回毫秒数。但是这个值并不唯一。例如:1385035174752。这个数字可能会出现两次或更多。
我的问题是为什么不唯一?如何从当前日期/时间获取唯一的数字?

1
你在尝试生成数字之间等待了超过一毫秒吗?同时,Chrome中没有重现。你正在使用哪个浏览器?(注意是 valueOf(),大写字母 O。) - David Thomas
如果您正在尝试创建唯一标识符,也许https://dev59.com/7HVD5IYBdhLWcg3wDXF3可能会有所帮助? - Olly Hodgson
1
如果您需要唯一的数字,请尝试使用全局计数器,在每次调用后递增。这可以避免上述问题并减少JavaScript代码量。 - Igor Benikov
@ David Thomas 不是的。在这种情况下,我应该使用其他方法来生成唯一标识。Chrome浏览器。 - user2635299
3个回答

10
如果您需要唯一性,请使用Math.random(),而不是任何Date() API。 Math.random返回0到1之间的整数。如果您真的想要一个基于当前时间的半唯一数字,可以将Date API与Math.random结合使用。例如
var id = new Date().getTime() + Math.random();

在现代浏览器中,您也可以使用 performance.now()。该 API 保证每次新调用的返回值都是唯一的。

1
我能否通过你上述提到的方法生成的时间戳来获取时间? - user2635299
1
@user2635299 是的。从 new Date().getTime() 返回的值是一个整数(即无小数点数字),而 Math.random() 的结果始终是介于0和1之间的实数,不包括1。因此,只需丢弃小数部分(例如使用 Math.floor()),然后您就可以获得可用于构造 Date 对象的数字时间戳(使用 Date 的 setTime 方法)。 - Rob W
@ Rob 谢谢。已接受 :) - user2635299
performance.now()不是唯一的,不幸的是。尝试像这样的代码:var i = 0, nums = []; while(i++ < 5000) nums.push(performance.now()); 当我在Chrome中运行这段代码时,performance.now()返回的一些值出现了多达300次! - undefined

1
在Windows上,计时器的分辨率大约为10.5毫秒。因此,即使几毫秒后,你也有可能获得相同的值。当然,有更好的计时器,但据我所知,它们不适用于JavaScript。

0

示例。即使是performance.now()有时也不能提供唯一的数字。您必须自己制定系统来生成它。可以像制作计数器一样,每次访问时将其增加1。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接