c - 64 位到 10 位的哈希函数

标签 c linux gcc hash x86-64

我想要一个散列函数,它接受一个长数字(64 位)并产生 10 位的结果。用于此目的的最佳哈希函数是什么。输入基本上是变量的地址(地址在 Linux 上是 64 位或 8 字节),因此我的哈希函数应该为此目的进行优化。

最佳答案

我会这样说:

uint32_t hash(uint64_t x)
{
    x >>= 3;
    return (x ^ (x>>10) ^ (x>>20)) & 0x3FF;
}

最低有效的 3 位不是很有用,因为大多数变量是 4 字节或 8 字节对齐的,所以我们将它们删除。 然后我们取出接下来的 30 位并将它们混合在一起 (XOR),每 block 10 位。

当然,您也可以使用 (x>>30)^(x>>40)^(x>>50) 但我不确定它们是否会有所不同在实践中。

关于c - 64 位到 10 位的哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11359441/

相关文章:

linux - top 命令的输出包含奇怪的字符

java - C++ 或 Java 中的 Linux 守护进程?

c - 从 sshell 读取符号...(未找到调试符号)...完成。 (是的,我编译时用了-g)

c - 了解 glibc

linux - 在特定终端中通过 Perl 运行 shell 命令

c - 内联汇编 : bad register name

c - 如何修复C中的 'Program terminated with signal SIGBUS, Bus error'

c++ - 奇怪的模板参数列表错误太少

c - 链接器找不到 initgraph() 和 closegraph()?

c - fscanf - 使用太长的字符串