【问题标题】:C# MD5 hashing in hashset [closed]哈希集中的 C# MD5 哈希 [关闭]
【发布时间】:2019-12-20 16:24:53
【问题描述】:

我对 c# 比较陌生。我目前正在学习哈希集,并了解哈希集不允许哈希集中的相同元素。我的问题是我是否能够使用 md5 哈希对目录中的文件进行哈希处理并将它们存储在哈希集中,以便我可以通过某种方式检查重复的哈希或文件?

【问题讨论】:

  • @Viv 在 C# 中有 n 种加密和解密方法。如果你卡在任何地方,sn-p 你的代码
  • 提防pigeonholes。哈希集和 MD5 也相似但不同。检查相等性是一个两步工作流程。首先,您检查两个事物的哈希是否相等。如果不是,你可以很确定,事情是不同的。但是您可以确保它们是相等的。为此,您需要执行更深入的相等性检查。对于文件,您可能必须比较每个字节。所以散列被用来快速清除很多明确的“不等于”。
  • @John MD5 产生一个 128 位的哈希值。 (与 guid 大小相同),因此两个不同的文件极不可能生成相同的哈希。
  • @Magnus 确实不太可能,但这是一个重要的区别,特别是如果 OP 将相同的逻辑应用于哈希,从而导致未来的结果更小。

标签: c# hash md5


【解决方案1】:

HashSet<T> 类是唯一元素的集合。 HashSet 类的命名空间是 System.Collections.Generic。它是在 .NET 3.5 中引入的。

以文件为例:

static void Main(string[] args)
{
    HashSet<string> FileData = new HashSet<string>();
    using (var md5 = MD5.Create())
    {
         using (var stream = File.OpenRead("C:\\FolderTest\\Document.txt"))
         {
              var hash = md5.ComputeHash(stream);
              var data = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
              FileData.Add(data);
         }
         using (var stream = File.OpenRead("C:\\FolderTest\\Document.txt"))
         {
              var hash = md5.ComputeHash(stream);
              var data = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
              FileData.Add(data);
         }
         using (var stream = File.OpenRead("C:\\FolderTest\\Document2.txt"))
         {
              var hash = md5.ComputeHash(stream);
              var data = BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
              FileData.Add(data);
         }
    }
    foreach (var file in FileData)
    {
         Console.WriteLine(file);
    } 
    Console.ReadKey();
}

在上面的代码中,我们创建了一个简单的HashSet&lt;string&gt; HashSet 类型并将字符串添加到其中。 如上所示,即使我们尝试添加重复的哈希数据字符串,也不会出现任何错误,但是当我们迭代集合时,我们找不到该字符串。

之后如何比较结果取决于您;你可以转换 例如,将字节数组转换为 base64,或直接比较字节。 (请注意,数组不会覆盖 Equals。使用 base64 是 更容易正确,但如果你真的很有效 只对比较哈希感兴趣。)see these answers

HashSet的特点

  • 当我们向HashSet&lt;T&gt;添加元素时自动增加 HashSet 的容量。
  • 它用于我们想要防止重复的情况 被插入到集合中。
  • HashSet 提供了很多数学集合运算,例如 set 加法(联合)并设置减法。

【讨论】:

    猜你喜欢
    • 2012-08-17
    • 2020-12-08
    • 2019-10-10
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多