C# 使用MD5哈希而不是字符串创建Guid是否有效?
我正在尝试实现一种检测重复文件的方法。我有一个MD5哈希方法(让我们忽略MD5被破坏的事实),如下所示:C# 使用MD5哈希而不是字符串创建Guid是否有效?,c#,.net,hash,md5,C#,.net,Hash,Md5,我正在尝试实现一种检测重复文件的方法。我有一个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
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
而不是从hashBytes
中创建字符串吗
Guid hashGuid = new Guid(hashBytes);
它仍然有效还是会失去唯一性?不确定这是否是最好的主意,但由于这两个值都是128位,因此您不会丢失任何数据,假设您没有尝试转换MD5的文本表示形式
只需将MD5字节直接转换为GUID,而无需首先将其转换为字符串。MD5哈希和GUID
基本上都表示128位二进制,因此:
- 另外:你不会失去任何独特性
- 另外:
Guid
是一种值类型,这意味着与string
相比,您可以避免分配
- 减:。。。但是如果要在任何地方显示它,实际上可能会分配多个字符串(即多次呈现相同的
Guid
)
- 减:Guid的
Guid有一个语义含义,在这里不会得到真正的尊重/期望
- 减:
Guid
默认格式与MD5哈希通常的表达方式不同
- 减号:
Guid
endianness是一团乱,因此,如果您想在原始字节和任何文本表示之间进行转换,请小心处理;这不是你所期望的
只有通过调用Guid.NewGuid()
正确生成Guid,Guid才能保证唯一性。通过从MD5字节构造GUI,可以获得零唯一性。您只将字节存储在名为“全局唯一标识符”的数据结构中,该结构可能不是唯一的
做这个实验:使用相同的字节数组创建两个guid。你认为GUID是不同的还是相等的?它们都是128位,使用MD5实际上是版本3 GUID:版本3 GUID中有几个字节是硬编码的,但我目前没有找到精确细节的引用。我正在将字节直接转换为GUID
谢谢Marc,避免分配是我选择Guid
的原因,但经过基准测试,结果表明,它比只处理字符串慢50%。