Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MD5哈希而不是字符串创建Guid是否有效?_C#_.net_Hash_Md5 - Fatal编程技术网

C# 使用MD5哈希而不是字符串创建Guid是否有效?

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

我正在尝试实现一种检测重复文件的方法。我有一个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
而不是从
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%。