algorighm/hash/string-hash.js

37 lines
1.8 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 对字符串进行哈希处理,生成一个哈希值。
* @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 编码值相乘,将字符的分布范围扩大到更广的范围内,以减少哈希冲突的可能性。
额外的位移和位运算操作帮助进一步混合哈希值,增强其离散性,从而减少冲突的可能性。
*/