建议使用大型哈希表(2 ^ 25个元素)

时间:2012-04-03 21:49:18

标签: haskell hash hashmap

我想在Haskell中编写一个生日攻击程序,用于SHA1的变体,它只产生50位散列。为此,我需要一个能够存储大约的哈希表。 2 ^ 25个条目。

此映射中的键为Int64,值为短字符串(~16个字节)。

有关使用哈希实现的任何建议吗?

(忽略上次更新 - 我需要一个2 ^ 50个元素的数组。)

2 个答案:

答案 0 :(得分:6)

对于每个8字节的2 ^ 25个条目,你只看数据的存储量为768MB,最多可能是3千兆字节,存储字节串的实际开销 - 每个字节串估计80个字节,然后你有哈希表/地图的内部存储,以及密钥的装箱等。

这意味着您可以将驻留在内存中的所有内容存储在一台体面的计算机上,这可以使问题保持​​相对清晰,但您的收集时间会很糟糕。

我建议使用大量较小的哈希表,通过对键空间进行分区,这样就可以并行运行大量更新,而不管您使用的哈希表。

至于实施:

你可以从IORefs中的无序容器中包装一堆不可变的哈希表,如宽扇出的哈希表,并使用某种atomicModifyIORef或类似ryan newton的compare和swap原语,或者你可以尝试使用旧的数据.HashTable以直截了当的方式实现。

后者将通过无序容器使用的散列数组映射尝试的对数因子来改进渐近因子,但Data.HashTable具有错误的常量。根据你的问题,这些因素可能会被取消。

答案 1 :(得分:2)

我也发布了同样的问题。根据一些建议,我正在使用Kyoto Cabinet。它非常酷,也提供了很好的性能。您也可以检查我的帖子,因为我有类似的问题。 EX。 onetwothree。也许这可能有帮助。