我需要理想(无冲突)哈希函数来将int映射到相同大小的int。最简单的方法是交换一些位的位置,但也许有一些很好的快速实现,操作数量少,容易改变散列种子?
也许使用一些快速对称密码? x86有AES
条指令。我不需要移植性,因此使用SSE
或其他x86特定加速指令的内容会很棒吗?因为散列应该非常快。
答案 0 :(得分:1)
uint32_t hash( uint32_t value )
{
return( value * 0xdeece66d + 0xb );
}
答案 1 :(得分:1)
使用像FNV32-1A这样的简单哈希,你可能会得到更好的结果。
crc32
,clmul
,aes
等复杂指令具有更高的吞吐量,但它们也可能具有更高的延迟。他们自己也不一定能给你更好的分配。
您应该考虑的其他事项之一是碰撞成本与散列函数。线性探针通常应该在合理数量的探针上运行良好,因为16个值将适合单个缓存线。通过预测缓存访问,CPU可能也能够隐藏访问成本。
还值得考虑的是占用率和桌子大小之间的权衡。有时,将表格大小加倍会更有效。