【发布时间】: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