【发布时间】:2013-08-29 16:13:11
【问题描述】:
我面临从 N 个 ID 派生单个 ID 的需要,起初我的数据库中有一个复杂的表,其中包含 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 一样具有全球性/通用性)
【问题讨论】: