是什么让这个伪GUID生成器比math.random()更好?

时间:2011-10-29 17:47:27

标签: javascript guid uuid

我在这里找到了问题:

Create GUID / UUID in JavaScript?

答案提供以下JS:

function S4() {
   return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
}

function guid() {
   return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
}

现在,其中一些对我来说似乎很愚蠢。为什么这么重复?我打算用它来命名上传到我的服务器的文件,这样它们就不会互相覆盖。这似乎不会始终生成唯一的数字。

上述代码比命名文件math.random()有什么好处。它甚至没有改变种子。

对不起,我从来没有使用过GUID / UUID,有些代码对我来说没有任何意义......

澄清

很多人都不像我问的那样回答这个问题。很多人都在解释GUID并不总是独一无二的,等等等等。那不是我要问的。我问,在math.random()上使用它有什么意义。

Joe似乎在评论中给了我最好的答案。

2 个答案:

答案 0 :(得分:2)

举个例子,即使.NET GUID也没有“绑定”到一台机器上。 .NET使用v4 UUID表示Guid.NewGuid()Simple proof that GUID is not unique),因此122位随机性加6个固定位。通过在这里阅读Are GUID collisions possible?,似乎SQL Server使用了一个完整的随机数(但我没有SQL Server来检查...已检查......它似乎使用相同格式的v4。有一个“固定的“4”和下一个“块”始终以8,9,A,B开头。所以122位随机性。)

那么这个随机生成器有什么问题,以“知道”格式提供128位随机性?您是否希望看到非固定格式的128位数?哇!非常实用......这里......取一个43438471087229589138546501885363994076(它是转换为数字值的GUID,基数为10)。现在,您想如何保存它最喜欢的数据库? VARCHARNUMERIC?将它打包到GUID中是不是更容易?

作为旁注......与math.random()相比有什么优势?嗯......单次使用math.random()就很清楚:-)我不知道math.random的单个调用有多少随机性,但最多只有63位(一个数字)在JS中是64位,但1位用于符号)。可能还有很多。

答案 1 :(得分:1)

即使这个答案也说:“你想要实际的GUID,还是看起来像GUID的随机数?”因为那些不是真正的GUID。同样来自原始主题:“没有办法在Javascript中生成真正的GUID,因为它们依赖于浏览器不公开的本地计算机的属性。”所以我的问题是:你需要一个GUID吗?或者只是一个随机文件名? GUID作为消费者并不神奇,它不是它的外观,它是如何生成的。对于随机文件名,使用时钟滴答+随机数将(至少为)有效...

在你的情况下,没有理由。但是如果你的JS代码与那些期望GUID或者那种形式的东西交谈,那么你需要传递类似格式的东西,因为你无法在纯JS中生成真实的东西。