常用hash函数介绍

unsigned int SDBMHash(char *str)
{
unsigned int hash = 0;


while (*str)
{
// equivalent to: hash = 65599*hash + (*str++);
hash = (*str++) + (hash << 6) + (hash << 16) - hash;
}


return (hash & 0x7FFFFFFF);
}


// RS Hash Function
unsigned int RSHash(char *str)
{
unsigned int b = 378551;
unsigned int a = 63689;
unsigned int hash = 0;


while (*str)
{
hash = hash * a + (*str++);
a *= b;
}


return (hash & 0x7FFFFFFF);
}


// JS Hash Function
unsigned int JSHash(char *str)
{
unsigned int hash = 1315423911;


while (*str)
{
hash ^= ((hash << 5) + (*str++) + (hash >> 2));
}
   
return (hash & 0x7FFFFFFF);
}


// P. J. Weinberger Hash Function
unsigned int PJWHash(char *str)
{
unsigned int BitsInUnignedInt = (unsigned int)(sizeof(unsigned int) * 8);
unsigned int ThreeQuarters = (unsigned int)((BitsInUnignedInt  * 3) / 4);
unsigned int OneEighth = (unsigned int)(BitsInUnignedInt / 8);
unsigned int HighBits = (unsigned int)(0xFFFFFFFF) << (BitsInUnignedInt - OneEighth);
unsigned int hash = 0;
unsigned int test = 0;


while (*str)
{
hash = (hash << OneEighth) + (*str++);
if ((test = hash & HighBits) != 0)
{
hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
}
}


return (hash & 0x7FFFFFFF);
}


// ELF Hash Function
unsigned int ELFHash(char *str)
{
unsigned int hash = 0;
unsigned int x = 0;


while (*str)
{
hash = (hash << 4) + (*str++);
if ((x = hash & 0xF0000000L) != 0)
{
hash ^= (x >> 24);
hash &= ~x;
}
}


return (hash & 0x7FFFFFFF);
}


// BKDR Hash Function
unsigned int BKDRHash(char *str)
{
unsigned int seed = 131; // 31 131 1313 13131 131313 etc..
unsigned int hash = 0;


while (*str)
{
hash = hash * seed + (*str++);
}


return (hash & 0x7FFFFFFF);
}


// DJB Hash Function
unsigned int DJBHash(char *str)
{
unsigned int hash = 5381;


while (*str)
{
hash += (hash << 5) + (*str++);
}


return (hash & 0x7FFFFFFF);
}


// AP Hash Function
unsigned int APHash(char *str)
{
unsigned int hash = 0;
int i;


for (i=0; *str; i++)
{
if ((i & 1) == 0)
{
hash ^= ((hash << 7) ^ (*str++) ^ (hash >> 3));
}
else
{
hash ^= (~((hash << 11) ^ (*str++) ^ (hash >> 5)));
}
}


return (hash & 0x7FFFFFFF);
}
### 常见哈希函数及其实现 #### 1. **除留取余法** 这是最简单的一种哈希函数,其基本形式为 `H(key) = key % m`,其中 `key` 是输入的关键字,`m` 是哈希表的大小。这种方法的优点在于计算简便,但在实际应用中容易受到关键字分布的影响。 ```python def hash_modulo(key, table_size): return key % table_size ``` 此方法适用于关键字均匀分布在整数范围内的场景[^1]。 --- #### 2. **乘法散列法** 该方法通过将关键字与某个常量相乘后再提取部分位的方式生成哈希值。具体公式如下: \[ H(\text{key}) = \lfloor A \cdot (\text{key} \mod W) \rfloor \% M \] 其中 \(A\) 是一个小于 1 的正实数,\(W\) 和 \(M\) 分别表示机器字长和哈希表长度。这种算法能够有效降低因模运算带来的偏移影响。 ```python import math def hash_multiplication(key, table_size, constant=0.618033): scaled_key = key * constant fractional_part = scaled_key - math.floor(scaled_key) return int(table_size * fractional_part) ``` 它广泛应用于需要高随机性的场合,比如密码学领域[^4]。 --- #### 3. **双重哈希(Double Hashing)** 当单个哈希函数无法满足需求时,可以采用双哈希技术解决冲突问题。其核心思想是在发生碰撞后利用另一个辅助哈希函数调整探查序列。例如, \[ H_i = (H_1(\text{key}) + i \times H_2(\text{key})) \% M \] 这里 \(i\) 表示尝试次数,而 \(H_1\) 和 \(H_2\) 则分别代表主次两套不同的哈希规则[^2]。 ```python def double_hashing(key, primary_func, secondary_func, table_size): h1 = primary_func(key, table_size) h2 = secondary_func(key, table_size) def probe(i): return (h1 + i * h2) % table_size return probe ``` 这种方式特别适合那些对性能敏感的应用程序,如数据库管理系统中的索引设计。 --- #### 4. **FNV 哈希算法** 快速非加密型哈希(Fast Non-cryptographic Hash Algorithm,FNV)因其速度优势成为许多现代软件系统的默认选项之一。它的更新过程遵循以下模式: \[ \begin{aligned} &\text{hash} := FNV\_offset \\ &\forall c \in \text{input}: \\ &\quad \text{hash} *= FNV\_prime\\ &\quad \text{hash} ^= c\\ \end{aligned} \] 最终返回经过多次迭代后的累积结果作为目标位置指示符[^3]。 ```python def fnv_hash(input_string, prime=16777619, offset_basis=2166136261): hash_value = offset_basis for byte in input_string.encode('utf-8'): hash_value = hash_value ^ byte hash_value = hash_value * prime return hash_value & 0xFFFFFFFF ``` 由于具备良好的抗聚类特性,因此非常适合文件路径名解析或者网络包分类等领域。 --- #### 5. **MD5/SHA 系列消息摘要算法** 尽管严格意义上讲这些属于安全散列家族成员而非传统意义上的定位工具,但由于它们产生的固定长度指纹同样可用于构建分布式缓存机制或其他一致性哈希方案之中,故也在此提及一下。 ```python import hashlib def md5_hash(input_data): hasher = hashlib.md5() hasher.update(str(input_data).encode('utf-8')) return int(hasher.hexdigest(), 16) % (2**32) ``` 这类强健型解决方案更多服务于身份验证协议或是防止篡改检测等方面的需求。 --- ### 应用场景分析 每种类型的哈希函数都有各自适用的最佳环境: - 对于小型项目或资源受限设备来说,简单的线性同余变换可能已经足够; - 如果追求更高的质量,则推荐选用基于数学理论精心构造出来的复杂模型; - 而涉及到隐私保护或者是大规模并发访问控制的时候,则务必考虑引入工业标准级的安全框架支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值