37 lines
1.8 KiB
JavaScript
37 lines
1.8 KiB
JavaScript
/**
|
||
* 对字符串进行哈希处理,生成一个哈希值。
|
||
* @param {string} str - 要进行哈希处理的字符串。
|
||
* @returns {number} - 生成的哈希值。
|
||
*/
|
||
export default function hashString(str) {
|
||
let hash = 5381; // 初始化哈希值为一个较大的质数
|
||
for (let i = 0; i < str.length; i++) {
|
||
// 使用位运算和乘法混合哈希值,并引入额外的位移和位运算以增强离散性
|
||
hash = (hash * 15485863) ^ (str.charCodeAt(i) * 2654435761);
|
||
hash += hash << 13; // 添加额外的位移操作
|
||
hash ^= hash >>> 7; // 添加额外的位运算
|
||
hash += hash << 3; // 添加额外的位移操作
|
||
hash ^= hash >>> 17; // 添加额外的位运算
|
||
}
|
||
return hash >>> 0; // 确保结果为非负整数
|
||
}
|
||
/*
|
||
函数说明:
|
||
这个函数用于对输入的字符串进行哈希处理,生成一个哈希值。哈希值是一个非负整数,用于唯一标识输入字符串。
|
||
|
||
参数:
|
||
str:要进行哈希处理的字符串。
|
||
返回值:
|
||
生成的哈希值,是一个非负整数。
|
||
算法说明:
|
||
初始化哈希值为 5381,这是一个较大的质数,提供了良好的哈希起点。
|
||
对字符串中的每个字符进行迭代处理,使用位运算和乘法混合哈希值。
|
||
引入额外的位移和位运算操作,以增强哈希值的离散性。
|
||
最后确保结果为非负整数,并返回哈希值。
|
||
魔幻数的选择:
|
||
初始哈希值选取了质数 5381,以提供良好的哈希起点。
|
||
乘数 15485863 是一个较大的质数,用于混合当前哈希值,增加哈希的随机性。
|
||
2654435761 是一个特殊的乘数,通过与字符的 Unicode 编码值相乘,将字符的分布范围扩大到更广的范围内,以减少哈希冲突的可能性。
|
||
额外的位移和位运算操作帮助进一步混合哈希值,增强其离散性,从而减少冲突的可能性。
|
||
*/
|