假设,我需要计算各种哈希方案的冲突。 输入序列中的元素数量为1e10 ^ 8或更多。 不知道如何分析这个,所以使用蛮力。
显然不要在RAM中保留这个哈希列表。 那是为我的需求编写代码的最佳方法吗?我应该把它转储到数据库或什么的?哪些库更适合使用?
谢谢!
答案 0 :(得分:2)
我建议保留一组文件,每个文件都以其中包含的哈希的前缀命名(例如,如果使用前缀长度为6,那么名为ffa23b.txt
的文件可能包含哈希ffa23b11d4334
,ffa23b712f3
等等。每次读取哈希时,都会将其附加到文件中,其名称对应于哈希的前N个字符。
您还可以使用bloom filters快速排除大部分哈希值,而不必将所有哈希值存储在内存中。这样,如果针对布隆过滤器的检查显示您之前可能已经实际看到它,那么您只需要回退到搜索给定的前缀文件 - 这种情况很少发生。
答案 1 :(得分:1)
简短回答:如果你有几千兆字节的RAM,使用Python词典,这是最简单的实现方式(可能运行得更快)。你可以这样做:
>>> mydict = {}
>>> for i in some_iterator:
mydict[i] = ''
然后检查映射中是否存在密钥:
>>> 0 in mydict
True
>>> 123456789 in mydict
False
长答案:您可以使用持久性键值存储,例如GDBM(看起来像Berkeley DB)或其他类型的数据库 - 但这种方法将是 way 比仅使用Python词典慢;另一方面,通过这种方法,你将具有持久性(如果你需要)。
您可以将GDBM理解为持久保存在单个文件中的字典(键值存储)。您可以按如下方式使用它:
>>> import gdbm
>>> kv = gdbm.open('my.db', 'cf')
然后将创建文件my.db
(请参阅Python GDBM documentation以了解cf
的含义)。
但它有一些限制,因为只支持字符串作为键和值:
>>> kv[0] = 0
Traceback (most recent call last)
[...]
TypeError: gdbm mappings have string indices only
>>> kv['0'] = 0
Traceback (most recent call last)
[...]
TypeError: gdbm mappings have string elements only
>>> kv['0'] = '0'
您可以使用具有虚拟值的所有密钥填充gdbm数据库:
>>> for i in some_iterator:
kv[str(i)] = ''
然后检查映射中是否存在密钥:
>>> '0' in kv
True
>>> '123456789' in kv
False