我有2个清单。一个是来自我所拥有的计算机(ListA)的文件的MD5和SHA1哈希列表。另一个是我从NSRL(ListB)下载的MD5和SHA1哈希列表。它是来自许多不同应用程序中包含的文件的MD5和SHA1哈希的汇编。
我正试图找到一种快速的方法来将这些列表相互比较。
仅供参考性能,系统中的哈希值为7.2gb文本文件,NSRL哈希列表大约为20gb。我有一个32gb ram的系统来执行处理,因此如果需要,它应该有足够的内存将两个文件加载到内存中。
我研究了Except,并考虑从ListA读取每一行并将其与ListB进行比较,但必须有一种比这更好的方法。有什么想法吗?
此外,这是从机器的哈希值到哈希数据库的已知哈希值的比较。它在取证方面非常普遍(从我的理解),所以我对已有的应用程序的建议持开放态度。
答案 0 :(得分:2)
使用哈希会比较快,但是没有足够的内存来将所有这些项加载到哈希中。假设SHA-1和MD5条目的数量相等,则ListA中将有大约5亿个条目,ListB中大约有10亿个条目。假设每个字节指针为8个字节,那将至少为80亿字节。
相反,您应首先使用Radix Trie存储ListB,然后在阅读ListA时执行比较。它的表现不如哈希,但它是一个很好的时空权衡。
答案 1 :(得分:0)
HashSet
个类型,一个用于ListA,另一个用于ListB。SymmetricExceptWith
(取O(n))获取两个列表中都没有的所有哈希值。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)。
很明确,你的案例中的瓶颈是将文件中的数据读入内存。在性能方面,我建议将文本文件读入内存,然后解析它。