我面临着从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位因此可以直接转换为新的Guid。
现在在我看来,这应该只是花花公子,而我可能会增加Guids碰撞的几率,但似乎我可以做到这一点,直到太阳烧毁并且没有接近遇到实际问题。
但是我不知道MD5是如何实际实现的,并且可能忽略了一些重要的东西,所以我的问题是:这有什么理由会导致问题吗? (假设亚万亿记录,理想情况下输出ID应与其他ID一样全局/通用)
答案 0 :(得分:0)
我的第一个想法是你不会生成真正的UUID。你最终会得到一组128位的任意组合。但是UUID不是任意位组。请参阅the Wikipedia page中的“M”和“N”标注。我不知道这在实践中是否是一个问题。也许您可以操作MD5输出中的一些位(第13和第17个十六进制数字)来将哈希值转换为真正的UUID,如this description of Version 4 UUID中所述。
另一个问题...... MD5并没有很好地在可能的输出范围内分配生成的值。换句话说,一些可能的值比其他值更可能更频繁地生成。或者正如维基百科文章所说,MD5不是collision resistant。
然而,正如你所指出的那样,碰撞的可能性可能是不现实的。
我可能会尝试通过重复组合值来增加熵,以便为MD5函数创建更长的输入。在您的示例代码中,取32个八位字节值并重复使用它来创建10或1,000倍的值(320 octects,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 -8- DA2555459C878BC2A6B-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
......或者更重复的事情。