最近在读 UCC 源码时,发现作者在处理字符串哈希时使用了 ELFHash 函数。这个算法在底层系统开发中非常经典,今天就把它的核心逻辑梳理一下,方便大家参考。
算法核心逻辑
ELF Hash 的设计初衷是为了快速计算字符串的哈希值。它通过循环遍历字符串,将每个字符的 ASCII 码逐步融入哈希值中。关键步骤包括:
- 位移累加:每次迭代将当前哈希值左移 4 位,并加上当前字符的 ASCII 码。这相当于把新字符'塞'进低位。
- 高位处理:如果高 4 位不为 0(说明数据已经累积到一定程度),就需要把高位的值'揉'回到低位区域,防止高位溢出导致信息丢失。具体做法是将高 4 位右移 24 位后与原哈希值异或。
- 清零高位:异或完成后,需要将高 4 位清零,保证哈希值始终保持在有效范围内。
- 符号位保护:最后返回前,用
0x7FFFFFFF进行掩码,强制最高位为 0,避免产生负数影响后续逻辑。
代码实现
下面是完整的 C++ 实现版本,保留了必要的注释以便理解每一步的意图:
unsigned int ELFHash(char *str)
{
unsigned int hash = 0;
unsigned int x = 0;
while (*str)
{
// 哈希左移 4 位,把当前字符 ASCII 存入 hash 低四位
hash = (hash << 4) + (*str++);
// 检查最高 4 位是否溢出
if ((x = hash & 0xF0000000L) != 0)
{
// 如果最高位不为 0,说明正在处理第 7 个字符左右的数据
// 此时若不处理,继续移位会导致早期字符信息被移出
// 将高 4 位右移 24 位后异或回低部,保留高位信息
hash ^= (x >> 24);
// 清除高 4 位,只保留低 28 位参与下一轮运算
hash &= ~x;
}
}
// 强制符号位为 0,返回无符号正整数
return (hash & 0x7FFFFFFF);
}
注意事项
实际使用时要注意,虽然这个算法速度快且实现简单,但在对抗性场景下可能存在碰撞风险。如果是用于安全校验,建议结合其他强哈希算法使用;如果是用于内部查找表,则完全够用。

