将MD5哈希创建为Guid是否有效?

6

我正在尝试实现一种检测重复文件的方法。我有一个MD5哈希方法(让我们忽略MD5已经被破解的事实),如下:

using(MD5 hasher = MD5.Create())
using(FileStream fs = File.OpenRead("SomeFile"))
{
    byte[] hashBytes = hasher.ComputeHash(fs);
    string hashString = string.Join(string.Empty, hashBytes.Select(x => x.ToString("X2"))); 
}

我是否可以直接用hashBytes创建一个Guid,而不是将其转换为string

Guid hashGuid = new Guid(hashBytes);

这个值是否仍然有效,或者我会失去唯一性?


它们都是128位。 - TheGeneral
1
使用MD5实际上是版本3的GUID:https://dev59.com/questions/f2Ij5IYBdhLWcg3wWkCd。版本3 GUID中有几个字节是硬编码的,但我目前没有找到确切细节的参考。 - Bryce Wagner
3个回答

9

MD5哈希和Guid本质上都表示128位二进制,所以:

  • +:您不会失去任何唯一性
  • +: Guid是值类型的事实意味着与string相比,您避免了分配...
  • -:...但是,如果您要在任何地方显示它,则可能实际上会分配多个字符串(即渲染多次相同的Guid
  • -:对于Guid有语义意义,在此处不会真正受到尊重/预期
  • -:Guid的默认格式与通常表示MD5哈希的方式不同
  • -:Guid字节序是一种混乱,因此,如果要在原始字节和任何文本表示之间进行转换,请非常小心;这不是您所期望的

谢谢Marc,避免分配内存是我选择Guid的原因,但经过基准测试后发现它比处理字符串慢50%。 - MaYaN

0

我不确定这是否是最佳方案,但由于两个值都是128位,如果您不想将MD5的文本表示形式转换,那么您不会丢失任何数据。

直接将MD5字节转换为GUID,而不是先将其转换为string


我正在将字节直接转换为 Guid - MaYaN

-3

只有通过调用 Guid.NewGuid() 才能保证 Guid 的唯一性。通过从 MD5 字节构造 Guid,您无法获得任何唯一性。您只是将字节存储在名为“全局唯一标识符”的数据结构中,这可能不是唯一的。

进行此实验:使用相同的字节数组创建两个 Guid。您期望 Guids 是不同还是相同的?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接