1

我面临着从 N 个 ID 派生单个 ID 的需要,起初 ai 在我的数据库中有一个复杂的表,其中包含 FirstID、SecondID 和一个带有剩余 ID 的 varbinary(MAX),虽然这在技术上是痛苦的、缓慢的,和集中所以我想出了这个:

C# 中的简单版本:

Guid idA = Guid.NewGuid();
Guid idB = Guid.NewGuid();

byte[] data = new byte[32];
idA.ToByteArray().CopyTo(data, 0);
idB.ToByteArray().CopyTo(data, 16);

byte[] hash = MD5.Create().ComputeHash(data);
Guid newID = new Guid(hash);

现在一个合适的版本将对 ID 进行排序并支持两个以上,并且可能重用 MD5 对象,但这应该更快理解。

现在安全性不是其中的一个因素,没有一个 ID 是秘密的,只是这样说,因为当你说 MD5 时,我说话的每个人都会反应很糟糕,而 MD5 对此特别有用,因为它输出 128 位,因此可以直接转换到一个新的指导。

现在在我看来,这应该只是花花公子,虽然我可能会增加 Guids 碰撞的几率,但我似乎仍然可以做到这一点,直到太阳燃烧殆尽,并且离遇到实际问题还差得远。

但是我不知道 MD5 是如何实际实现的,并且可能忽略了一些重要的事情,所以我的问题是:这有什么原因会导致问题吗?(假设低于万亿条记录,理想情况下,输出 ID 应该与其他 ID 一样具有全球性/通用性)

4

1 回答 1

1

我的第一个想法是您不会生成真正的 UUID。您最终会得到一组任意的 128 位。但是 UUID 不是一组任意的位。请参阅Wikipedia 页面中的“M”和“N”标注。我不知道这在实践中是否存在问题。或许您可以在 MD5 输出中操作一些位(第 13 位和第 17 位十六进制数字)以将散列输出转换为真正的 UUID,如第 4 版 UUID 的描述中所述。

另一个问题…… MD5在可能的输出范围内分配生成的值方面做得不好。换句话说,一些可能的值比其他值更有可能更频繁地生成。或者正如维基百科文章所说,MD5 不是抗碰撞的。

然而,正如您所指出的,可能发生碰撞的可能性是不现实的。

我可能很想尝试通过重复您的组合值来增加熵,从而为 MD5 函数创建更长的输入。在您的示例代码中,取 32 个八位字节的值并重复使用它来创建一个长 10 倍或 1,000 倍的值(320 个八位字节、32,000 或其他)。

换句话说,如果为了我自己的方便而在这里使用十六进制字符串而不是您的示例中的八位位组,给定这两个 UUID:

78BC2A6B-4F03-48D0-BB74-051A6A75CCA1

FCF1B8E4-5548-4C43-995A-8DA2555459C8

…而不是将其提供给 MD5 函数:

78BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C8

…喂这个:

78BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B- 4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03- 48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0- BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B- 4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03- 48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0- BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C878BC2A6B-4F03-48D0-BB74-051A6A75CCA1FCF1B8E4-5548-4C43-995A-8DA2555459C8

……或者重复更长时间的事情。

于 2013-11-13T09:48:29.367 回答