比较大的哈希列表

时间:2014-05-20 22:09:42

标签: c# .net hash

我有2个清单。一个是来自我所拥有的计算机(ListA)的文件的MD5和SHA1哈希列表。另一个是我从NSRL(ListB)下载的MD5和SHA1哈希列表。它是来自许多不同应用程序中包含的文件的MD5和SHA1哈希的汇编。

我正试图找到一种快速的方法来将这些列表相互比较。

仅供参考性能,系统中的哈希值为7.2gb文本文件,NSRL哈希列表大约为20gb。我有一个32gb ram的系统来执行处理,因此如果需要,它应该有足够的内存将两个文件加载到内存中。

我研究了Except,并考虑从ListA读取每一行并将其与ListB进行比较,但必须有一种比这更好的方法。有什么想法吗?

此外,这是从机器的哈希值到哈希数据库的已知哈希值的比较。它在取证方面非常普遍(从我的理解),所以我对已有的应用程序的建议持开放态度。

3 个答案:

答案 0 :(得分:2)

使用哈希会比较快,但是没有足够的内存来将所有这些项加载到哈希中。假设SHA-1和MD5条目的数量相等,则ListA中将有大约5亿个条目,ListB中大约有10亿个条目。假设每个字节指针为8个字节,那将至少为80亿字节。

相反,您应首先使用Radix Trie存储ListB,然后在阅读ListA时执行比较。它的表现不如哈希,但它是一个很好的时空权衡。

答案 1 :(得分:0)

  1. 创建一个可以保存单个哈希项数据的类
  2. 确保它正确实现GetHashCode和Equals。
  3. 创建您创建的2 HashSet个类型,一个用于ListA,另一个用于ListB。
  4. 将列表中的所有项目加载到哈希集。
  5. 使用SymmetricExceptWith(取O(n))获取两个列表中都没有的所有哈希值。

  6. var setA = new HashSet<Item>(LoadListA());
    var setB = new HashSet<Item>(LoadListb());
    setA.SymmetricExceptWith(setB);
    
    if (setA.Count > 0)
    {
        Console.WriteLine("Extra items ןn A or B");
    }
    

答案 2 :(得分:0)

使用HashSet。首先将两个列表中的所有项目加载到HashSet中。那么我们IntersectWith将采用O(n)。

很明确,你的案例中的瓶颈是将文件中的数据读入内存。在性能方面,我建议将文本文件读入内存,然后解析它。