在你将这篇文章标记为重复之前,请先听我说完。其他的问题可能有一个(很可能)不正确的答案。
我不知道.NET如何生成它的GUID,可能只有微软知道,但是很有可能它只是调用了CoCreateGuid()。然而,该函数被文档记录为调用UuidCreate()。创建UUID的算法已经相当好地记录。
长话短说,尽管如此,看起来System.Guid.NewGuid()
确实使用版本4 UUID生成算法,因为它生成的所有GUID都符合标准(自己看看,我试过几百万个GUID,它们都匹配)。
换句话说,这些GUID基本上是随机的,除了一些已知的比特位。
这又引出了一个问题 - 这个随机究竟有多随机?就像每个好的程序员知道的那样,伪随机数算法只有其种子(熵)一般随机。那么UuidCreate()
的种子是什么?PRNG重新播种的频率是多少?它具有密码学强度吗,还是如果两台计算机不小心同时调用System.Guid.NewGuid()
,它们会产生相同的GUID?如果收集了足够多的连续生成的GUID,是否可以猜测PRNG的状态?
添加:为了澄清,我想了解它有多随机,因此 - 我在哪里可以使用它。所以,让我们在这里建立一个粗略的“随机性”尺度:
- 基础随机性,以当前时间为种子。可用于在纸牌游戏中洗牌,但由于即使不进行尝试也很容易出现碰撞,因此在其他方面使用效果不佳。
- 更高级的随机性,除了时间外,还使用其他机器特定因素作为种子。可能仅在系统启动时进行一次设定。这可用于在数据库中生成ID,因为重复概率较小。但从安全性角度来看并不好,因为结果可以在付出足够努力后被预测。
- 密码学随机性,使用设备噪声或其他高级随机源作为种子。每次调用时重新进行设定,或者至少经常重新设定。可用于向不受信任的参与者分发的会话ID等。
我思考是否可以将它们用作DB ID,并且Guid.comb算法实现是否与System.Guid.NewGuid()
(如NHibernate所做的)存在缺陷。
Guid.NewGuid()
调用了Win32Native.CoCreateGuid
。 - Steven