gpt4 book ai didi

javascript - 在散列函数中使用 Javascript 中的 float

转载 作者:行者123 更新时间:2023-11-30 19:23:55 26 4
gpt4 key购买 nike

我有一个这样的哈希函数。

class Hash {
static rotate (x, b) {
return (x << b) ^ (x >> (32-b));
}
static pcg (a) {
let b = a;
for (let i = 0; i < 3; i++) {
a = Hash.rotate((a^0xcafebabe) + (b^0xfaceb00c), 23);
b = Hash.rotate((a^0xdeadbeef) + (b^0x8badf00d), 5);
}
return a^b;
}
}
// source Adam Smith: https://groups.google.com/forum/#!msg/proceduralcontent/AuvxuA1xqmE/T8t88r2rfUcJ

我是这样用的

console.log(Hash.pcg(116)); // Output: -191955715

只要我发送一个整数,我就会得到一个整数。现在问题来了。如果我有一个 float 作为输入,则会发生四舍五入。数字 Hash.pcg(1.1) 和 Hash.pcg(1.2) 将产生相同的结果。我希望不同的输入产生不同的结果。一种可能的解决方案是将输入相乘,这样小数点就不会向下舍入,但是否有更优雅、更灵活的解决方案?

有没有办法将 float 转换为唯一整数?每个 float 都会产生不同的整数。

性能很重要。

最佳答案

这不是一个完整的答案,但我没有足够的空间来发表评论了。 :)

对于 32 位范围之外的整数以及非整数值,您会遇到问题。

JavaScript 将所有数字作为 64 位 float 处理。这会为您提供 -9007199254740991 到 9007199254740991 (±(2^53 - 1)) 范围内的精确整数,但哈希算法中使用的按位运算符( ^<<>> )仅适用于32 位范围。

由于可能存在的非整数比整数多得多,因此普通数字不可能存在一对一的映射。你可以用 BigInt 解决问题s,但这可能会导致相对较慢的性能。

如果您愿意处理性能问题,可以使用 JavaScript 缓冲函数来获取 float 的实际位。 (我现在会详细说明如何做到这一点,但我必须要跑!)

编辑...晚餐回来...

您可以转换 JavaScript 的标准 number类型,即 64 位 float ,转换为 BigInt像这样:

let dv = new DataView(new ArrayBuffer(8));
dv.setFloat64(0, Math.PI);
console.log(dv.getFloat64(0), dv.getBigInt64(0), dv.getBigInt64(0).toString(16).toUpperCase())

输出结果是:

3.141592653589793 4614256656552045848n "400921FB54442D18"

第一项显示数字已正确存储为字节数组,第二项显示 BigInt从相同的位创建,最后一个是相同的 BigInt再来一遍,但以十六进制表示,以更好地显示 float 据格式。

一旦你转换了一个 number像这样给 BigInt (这不是相同的数值,但它是相同的位串)数字的每个可能值都将被唯一表示。

您在上述算法中使用的相同位运算符将适用于 BigInt s,但没有 32 位限制。我猜想为了获得最佳结果,您需要更改 32在您的代码中为 64 ,并使用 16 位(而不是 8 位)十六进制常量作为哈希键。

关于javascript - 在散列函数中使用 Javascript 中的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57128149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com