从字符串生成一个介于0和1之间的确定性哈希数

5
我正在寻找一种在JavaScript中对字符串进行“哈希”的方法,以便:

  • 结果是确定性的(相同输入字符串始终产生相同的结果)
  • 结果是介于0和1之间的十进制数
  • 结果在0到1空间中(有点)均匀分布。
例如:
decimalHash('hallo world') = 0.145     // some made up number
decimalHash('how are you?') = 0.345    // some made up number
decimalHash('fine, thanks!') = 0.945   // some made up number

我搜索了这样的方法,但目前找到的所有哈希函数都具有不同的特性。如果能提供任何帮助将不胜感激!


1
大多数哈希函数返回某个整数范围内的结果,但同时满足您的其他要求(确定性和相对均匀的分布)。为什么不将这样一个哈希函数的输出映射到0->1的范围内呢? - Joachim Sauer
1个回答

3
你可以使用一个系数为每个字符构建一个值,并将这些值相加。最后只保留小数部分即可创建自己的方法。
这种方法可能会产生碰撞。

const decimalHash = string => {
    let sum = 0;
    for (let i = 0; i < string.length; i++)
        sum += (i + 1) * string.codePointAt(i) / (1 << 8)
    return sum % 1;
}

console.log(decimalHash('a'));
console.log(decimalHash('aa'));
console.log(decimalHash('hallo world'));
console.log(decimalHash('how are you?'));
console.log(decimalHash('fine, thanks!'));


2
这不会给你一个均匀分布。 - Jim Mischel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接