gpt4 book ai didi

c# - 将哈希函数从 C# 转换为 Javascript 时存在按位数学问题

转载 作者:行者123 更新时间:2023-12-02 18:56:06 24 4
gpt4 key购买 nike

我有以下 C# 哈希函数(也在 SO 上找到!),我在覆盖几个不同平台的一堆应用程序中使用它:

public static int GetStableHash(string s, int hashlength)
{
uint hash = 0;
var bytes = System.Text.Encoding.ASCII.GetBytes(s);
foreach (byte b in bytes)
{
hash += b;
hash += (hash << 10);
hash ^= (hash >> 6);
}
// final avalanche
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);

return (int)(hash % hashlength);
}

我正在尝试将其移植到 Javascript,其中另一个应用程序将生成匹配的哈希值。唯一的问题是 JS 没有 uint 类型,并且在执行按位数学之前似乎会在内部将整数转换为 float 。这导致此移植函数出现问题:

function getStableHash(s, hashlength)
{
var hash = 0;
var bytes = stringToBytes(s); // this function just grabs a byte array for the given input string
for (var i = 0; i < bytes.length; i++)
{
hash += bytes[i];
hash += (hash << 10);
hash ^= (hash >> 6);
}
// final avalanche
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);

return Math.round(hash % hashlength);
}

在上面的代码中,由于签名位的存在,移位最终会导致问题,并且生成的哈希值与 C# 版本的输出不匹配。从其他各种 SO 帖子(例如,参见 Bitwise operations with big integers)中尚不清楚解决此问题的最佳方法是什么。

生产环境中已经有 C# 和 C++ 中使用哈希方法的代码,因此无法通过在其他地方更改哈希方法来适应 Javascript 的缺点。

如何解决 JS 的内部类型转换?

最佳答案

尝试以下操作:

  1. 使用无符号右移>>>而不是有符号

  2. 在取模之前使用 >>> 0 将最终结果转换为 无符号 32 位 int:

    return (hash >>> 0) % hashlength;

关于c# - 将哈希函数从 C# 转换为 Javascript 时存在按位数学问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15329503/

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