当前位置: 首页 > 知识库问答 >
问题:

从 MD5 哈希而不是字符串创建 Guid 是否有效?

闻人树
2023-03-14

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

除了从< code>hashBytes中创建一个< code>string之外,我是否可以像这样简单地创建一个< code>Guid?

Guid hashGuid = new Guid(hashBytes);

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

共有3个答案

邢法
2023-03-14

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

做这个实验:使用相同的字节数组创建两个Guid。你认为贵人是不同的还是平等的?

汪志业
2023-03-14

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

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

宰父学
2023-03-14

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

  • 加上:你不会失去任何独特性
  • plus:Guid是值类型这一事实意味着您避免了与string
  • 相比的分配
  • 减去:…但是如果你要在任何地方显示它,你实际上可能最终会分配多个字符串(即多次渲染相同的Guid
  • 减去:Guid有一个语义含义,在这里不会真正被尊重/期望
  • 减去:Guid默认格式与MD5哈希通常的表达方式不同
  • 减去:Guidendianness是一团糟,所以如果你想在原始字节和任何文本表示之间进行:非常小心;这不是你所期望的
 类似资料:
  • 问题内容: 有什么方法可以在Java中使用字符串的哈希码,然后重新创建该字符串? 例如这样的事情: 我之所以这样说,是因为我必须将字符串转换为整数值,然后从该整数值重构该字符串。 问题答案: 这是不可能的。String的哈希码是有损的;许多字符串值将导致相同的哈希码。一个整数有32个位,每个位置有两个值。即使是32个字符的字符串(例如,每个字符都有很多可能性)也无法映射为32位而不会发生冲突。他们

  • 问题内容: 我对加密/哈希知之甚少。 我必须对加密密钥进行哈希处理。Java中的示例是这样的… 现在,如果我错了,请纠正我,但是上面的代码使用MD5算法对字符串进行了哈希处理。 当我在C#中哈希相同的字符串时,我希望得到相同的结果。 我当前的C#代码看起来像这样… 但是末字节结果不匹配。 Java得到… C#得到… 我需要C#代码才能获得与Java代码相同的结果(不是相反),有什么想法吗? 谢谢。

  • 问题内容: 我不知道如何实现从php到java的这几行。 好吧,我尝试将其转换,但是得到了不同的结果! java中的结果不同于php中的结果。 你能帮我吗??先感谢您 :) 问题答案: 您不能在不将其转换为字符串的情况下直接使用seq20吗?我会这样:

  • 问题内容: 我有一个要哈希的字符串。在node.js中生成哈希的最简单方法是什么? 哈希用于版本控制,而非安全性。 问题答案: 看看crypto.createHash(algorithm)

  • 问题内容: Python MD5哈希与shell上md5sum命令创建的哈希不同。为什么? 问题答案: 追加a,因为您通常不希望外壳中的行不以换行符结尾(如果提示不是从最左边开始,则看起来很丑)。 使用参数省略尾随的换行符,它将输出与您的python脚本相同的校验和:

  • 问题内容: 我不想计算文件的校验和,只是想知道给定的字符串是否是有效的校验和 问题答案: SHA1验证程序: MD5验证程序: