当前位置: 面试刷题>> 哈希函数 (经典算法题500道)
### 题目描述补充
题目:设计一个哈希函数,用于将字符串映射到一个固定大小的整数范围内(例如0到N-1),并尽量减少哈希冲突的发生。哈希函数需要能够处理任意长度的字符串输入,并且具备较高的均匀性和较低的碰撞率。请分别用PHP、Python、JavaScript语言实现该哈希函数,并在实现中避免使用任何内建的高级哈希函数库。
### PHP实现示例
```php
function customHash($str, $mod = 1000003) { // 选择一个质数作为模,以减少碰撞
$hash = 0;
$p = 31; // 选择一个质数作为乘数
for ($i = 0; $i < strlen($str); $i++) {
$hash = ($hash * $p + ord($str[$i])) % $mod;
}
return $hash;
}
// 测试哈希函数
echo customHash("hello", 1000003);
```
### Python实现示例
```python
def custom_hash(s, mod=1000003):
hash_value = 0
p = 31
for char in s:
hash_value = (hash_value * p + ord(char)) % mod
return hash_value
# 测试哈希函数
print(custom_hash("hello", 1000003))
```
### JavaScript实现示例
```javascript
function customHash(str, mod = 1000003) {
let hash = 0;
const p = 31;
for (let i = 0; i < str.length; i++) {
hash = (hash * p + str.charCodeAt(i)) % mod;
}
return hash;
}
// 测试哈希函数
console.log(customHash("hello", 1000003));
```
### 注意事项
- 这些实现中,我们选择了质数`31`作为乘数,因为它是一个常见的选择,在哈希函数中通常使用质数以减少碰撞。
- 模数`mod`(在上述代码中设置为`1000003`)也选择了一个质数,这同样有助于减少哈希碰撞。
- 这些哈希函数都假设输入为ASCII字符串。对于包含Unicode字符的字符串,可能需要调整`ord()`(在PHP中)或`charCodeAt()`(在JavaScript中)来正确处理字符的编码。
- 题目要求不使用内建的高级哈希函数库,因此在这些实现中我们从头开始计算哈希值。
### 码小课相关内容分享
码小课网站中有更多关于哈希函数、哈希表以及高级数据结构的内容分享,包括但不限于不同哈希函数的设计原理、优化技巧、哈希冲突的解决策略等。通过深入学习这些内容,你将能够更好地理解和应用哈希函数来解决实际问题。