从 MD5 哈希而不是字符串创建 Guid 有效吗?
Is creating a Guid out of an MD5 hash instead of String valid?
我正在尝试实现一种检测重复文件的方法。我有一个 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
中创建一个 string
,我可以像这样简单地从中创建一个 Guid
吗?
Guid hashGuid = new Guid(hashBytes);
它仍然有效还是会失去唯一性?
不确定这是否是最好的主意,但由于两个值都是 128 位,因此您不会丢失任何数据,假设您没有尝试转换 MD5 的文本表示.
只需将 MD5 字节直接转换为 GUID,无需先将其转换为 string
。
MD5 哈希和 Guid
本质上 都表示 128 位二进制,所以:
- 另外:您不会失去任何独特性
- plus:
Guid
是一个值类型的事实意味着与 string
... 相比,您可以避免分配
- 减号:...但是如果你要在任何地方显示它,你实际上可能最终会分配多个字符串(即多次渲染相同的
Guid
)
- 减号:
Guid
的语义在此处 respected/expected 并不是真正的
- 减号:
Guid
默认格式与 MD5 哈希通常的表达方式不同
- 减号:
Guid
字节顺序是 一团糟,所以如果你想在原始字节和任何文本表示之间找到:tread very仔细; 不是你所期望的
只有通过调用Guid.NewGuid()
正确生成的Guids才能保证唯一性。通过从 MD5 字节构造 Guid,您获得了零唯一性。您仅将字节存储在名为 "Globally Unique IDentifier" 的数据结构中,该数据结构可能不是唯一的。
做这个实验:创建两个使用相同字节数组的 Guid。您希望 Guid 不同还是相同?
我正在尝试实现一种检测重复文件的方法。我有一个 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
中创建一个 string
,我可以像这样简单地从中创建一个 Guid
吗?
Guid hashGuid = new Guid(hashBytes);
它仍然有效还是会失去唯一性?
不确定这是否是最好的主意,但由于两个值都是 128 位,因此您不会丢失任何数据,假设您没有尝试转换 MD5 的文本表示.
只需将 MD5 字节直接转换为 GUID,无需先将其转换为 string
。
MD5 哈希和 Guid
本质上 都表示 128 位二进制,所以:
- 另外:您不会失去任何独特性
- plus:
Guid
是一个值类型的事实意味着与string
... 相比,您可以避免分配
- 减号:...但是如果你要在任何地方显示它,你实际上可能最终会分配多个字符串(即多次渲染相同的
Guid
) - 减号:
Guid
的语义在此处 respected/expected 并不是真正的 - 减号:
Guid
默认格式与 MD5 哈希通常的表达方式不同 - 减号:
Guid
字节顺序是 一团糟,所以如果你想在原始字节和任何文本表示之间找到:tread very仔细; 不是你所期望的
只有通过调用Guid.NewGuid()
正确生成的Guids才能保证唯一性。通过从 MD5 字节构造 Guid,您获得了零唯一性。您仅将字节存储在名为 "Globally Unique IDentifier" 的数据结构中,该数据结构可能不是唯一的。
做这个实验:创建两个使用相同字节数组的 Guid。您希望 Guid 不同还是相同?