当前位置: 面试刷题>> 哈希函数 (经典算法题500道)


题目描述补充

题目:设计一个哈希函数,用于将字符串映射到一个固定大小的整数范围内(例如0到N-1),并尽量减少哈希冲突的发生。哈希函数需要能够处理任意长度的字符串输入,并且具备较高的均匀性和较低的碰撞率。请分别用PHP、Python、JavaScript语言实现该哈希函数,并在实现中避免使用任何内建的高级哈希函数库。

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实现示例

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实现示例

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中)来正确处理字符的编码。
  • 题目要求不使用内建的高级哈希函数库,因此在这些实现中我们从头开始计算哈希值。

码小课相关内容分享

码小课网站中有更多关于哈希函数、哈希表以及高级数据结构的内容分享,包括但不限于不同哈希函数的设计原理、优化技巧、哈希冲突的解决策略等。通过深入学习这些内容,你将能够更好地理解和应用哈希函数来解决实际问题。

推荐面试题