我有一组(静态,在编译时已知)大约200万个值,每个20个字节。我需要的是一种快速O(1)方法来检查给定值是否在此集合中。似乎具有位数组的完美散列函数对于此是理想的,但我找不到创建它的简单方法。有一些实用程序,如gperf,但它们太复杂了。另外,在我的情况下,没有必要接近100%的负载系数,即使10%就足够了,但保证没有碰撞。此功能的另一个要求是简单,没有很多条件:它将在GPU上运行。 你对这个案子有什么建议?
答案 0 :(得分:2)
请参阅我的回答here。问题有点不同,但解决方案可以根据您的需求进行定制。原件使用100%的负载系数,但可以轻松更改。它的工作原理是在启动时就地调整数组(这可以在编译时完成,但这意味着编译生成的代码)。
WRT哈希函数:如果你对20byte对象的内容一无所知,任何合理的哈希函数(FNV,Jenkins或我的)都会足够好。
答案 1 :(得分:0)
在阅读了有关完美散列的更多信息后,我决定不尝试实现它,而是使用cuckoo散列表。它更简单,最多需要2次访问表(或任何其他数字> 1,最常用的是2..5)而不是1才能进行完美散列。