【问题标题】:Is creating a Guid out of an MD5 hash instead of String valid?从 MD5 哈希而不是 String 创建 Guid 是否有效?
【发布时间】:2019-08-27 05:21:45
【问题描述】:

我正在尝试实现一种检测重复文件的方法。我有一个 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"))); 
}

我可以像这样简单地创建一个Guid,而不是从hashBytes 中创建一个string 吗?

Guid hashGuid = new Guid(hashBytes);

它仍然有效还是我会失去唯一性?

【问题讨论】:

标签: c# .net hash md5


【解决方案1】:

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

  • 另外:您不会失去任何独特性
  • 另外:Guid 是值类型这一事实意味着与string 相比,您可以避免分配...
  • minus: ...但是如果你要在任何地方显示它,你实际上可能会分配多个字符串(即渲染相同的Guid多个次)
  • 减号:Guid 的语义含义在这里不会真正得到尊重/预期
  • 减号:Guid 默认格式与 MD5 哈希的通常表达方式不同
  • minus: Guid endianness 是一个混乱,所以如果你想在原始字节和任何文本表示之间切换:非常小心;这不是你所期望的

【讨论】:

  • 感谢 Marc,避免分配是我选择 Guid 的原因,但经过基准测试后发现它比仅处理字符串慢 50%。
【解决方案2】:

不确定这是否是最好的主意,但由于这两个值都是 128 位,因此您不会丢失任何数据,假设您没有尝试转换 MD5 的文本表示 .

只需将 MD5 字节直接转换为 GUID,无需先将其转换为 string

【讨论】:

  • 我将字节直接转换为Guid
【解决方案3】:

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

做这个实验:使用相同的字节数组创建两个 Guid。您希望这些 Guid 是不同的还是相同的?

【讨论】:

    猜你喜欢
    • 2010-09-13
    • 2012-02-09
    • 2010-12-01
    • 2017-05-04
    相关资源
    最近更新 更多