【问题标题】:Why this implementations have different results?为什么这个实现有不同的结果?
【发布时间】:2020-01-03 14:14:33
【问题描述】:

您好,我需要从c#ts/js 中的相同文本生成一些哈希/校验和 我在stackoverflow上找到了一些解决方案,但有一些问题

所以我的js

private getStableHash(s, hashlength) {
let hash = 0;
const bytes = this.string2Bin(s); 
for (let i = 0; i < bytes.length; i++) {
    hash += bytes[i];
    hash += (hash << 10);
    hash ^= (hash >> 6);
}
// final avalanche
hash += (hash << 3);
console.log(hash);
hash ^= (hash >> 11);
console.log(hash);
hash += (hash << 10);
console.log(hash);
return Math.round(hash % hashlength);
}

 private string2Bin(str) {
 const result = [];
 for (let i = 0; i < str.length; i++) {
  result.push(str.charCodeAt(i));
 }
 return result;
 }

和c#

 private int GetStableHash(string s, int hashlength)
    {
        int 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 << 10);

        return (int)(hash % hashlength);
    }

getStableHash('dbo.files.xxx.yyy.zzz/aaa/3',10000000) 在这两种情况下都返回 7414302 所以它很好

但是如果我改变这最后一行

  hash += (hash << 10);

  hash += (hash << 15);

在两种实现中

c#将此行中的474798750更改为-1986274658并返回-6274658

js 将此行 474798750 更改为 2308692638 并返回 8692638

这是为什么呢?我在这里缺少什么? 问候!

【问题讨论】:

  • 因为int hash会使号码溢出。将其更改为long hash...

标签: javascript c# hash bit-manipulation


【解决方案1】:

int 在 C# 中是一个 singed 32 位整数。如果您进行将第一位设置为 1 的位移,则该数字将变为负数。

JS 中的numbers 是 64 位浮点数,整数精度为 52 位。然而,位运算符仅在数字的 32 位符号表示上完成

因此&lt;&lt; 的位移在两者中是相同的,但加法 += 在 C# 中仅适用于 32 位,但在 JS 中适用于 52 位。

【讨论】:

  • 所以我应该在 c# 中做 uint 吗?但是js没有这种类型?问题会一样吗?
  • @d00lar 忘记我之前的回答,那是完全错误的(js 32 位表示也已签名)。要获得相同的行为,您必须在 C# 中使用具有更多位的表示形式(例如 long ...?),然后在进行按位移位之前转换为 32 位 int
  • 所以让这个散列变量变长并且散列 += ((int)hash int maxvalue 那么它会溢出吗?
  • @d00lar,jup,就像在 js 中一样。
猜你喜欢
  • 2023-04-11
  • 2014-02-03
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多