这个问题问得好。我认为在匆忙中随处使用UUID并没有得到充分考虑。我尚未找到任何可靠的研究。
一个建议:在这里非常小心,并充分了解您的密码学。如果您使用128位的UUID,则“生日效应”会告诉我们,生成大约2 ^ 64个密钥后,如果每个密钥中都有128位的熵,则很可能发生冲突。
要确保确实如此,实际上是相当困难的。真正的随机性可以由以下因素产生:(a)放射性衰变(b)经常被污染的随机本底无线电噪声,除非您小心谨慎(c)适当选择的电子噪声,例如取自反向偏置的齐纳二极管。(我已经玩过最后一款了,它的工作原理就像是一种魅力,顺便说一句)。
我不会信任诸如“我一年没有见过”之类的声明,除非用户生成了接近2 ^ 64(即大约10 ^ 19)个密钥的东西,并相互对照检查,非平凡的运动。
问题是这样的。假设您将密钥与其他人在同一个密钥空间中生成的所有其他密钥进行比较时,熵只有100位。您将开始在大约2 ^ 50即看到碰撞。大约10 ^ 15个键。如果仅用1万亿个键填充数据库,则发生冲突的机会仍然可以忽略不计。而且,如果您不进行检查,那么以后您将收到意外错误,这些错误会蔓延到Peta行大小的数据库中。这可能很难咬。
有多种生成此类UUID的方法这一事实应引起暂时的关注。当您意识到很少有生成器使用类型4 UUID具有足够熵的“真正随机”过程时,您应该过分担心,除非您仔细检查了生成器的熵含量。(大多数人不会这样做,甚至不知道如何做;您可能会从DieHarder套件开始)。不要将伪随机数生成与真正的随机数生成混淆。
至关重要的是,您必须意识到所放入的熵就是所拥有的熵,并且仅通过应用加密函数来扰动密钥就不会改变熵。如果我的整个空间都包含数字0和1,那么熵的内容与以下两个字符串的熵内容相同(如果仅有的两种选择),可能并不直观直观:“这是一个非常复杂的字符串293290729382832 * !@@#&^%$$),. m}”和“现在完全不同”。仍然只有两个选择。
随机性是很难正确的,并且仅仅相信“专家们已经看过了,所以就可以了”可能是不够的。专家密码学家(其中很少有真正精通的专家)是第一个承认他们经常弄错的人。我们信任heartbleed,DigiNotar等。
我认为Paul Tomblin正在采取适当的谨慎态度。我的2c。