我正在尝试使用以下代码生成固定长度哈希。
public int GetStableHash(string s)
{
string strKey = "myHashingKey";
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes(strKey);
byte[] contentBuffer = UE.GetBytes(s);
// Initialize the keyed hash object.
HMACSHA256 myhmacsha256 = new HMACSHA256(key);
byte[] hashValue = myhmacsha256.ComputeHash(contentBuffer);
return BitConverter.ToInt32(hashValue,0);
}
它给了我这样的输出。
-1635597425
我需要一个正数固定长度(8位数)。有人可以告诉我该怎么做。
提前致谢。
答案 0 :(得分:2)
您正在尝试从哈希函数输出中获取一个8位数字,该数字最多可以
lg(2 ^ 256)~78
十进制数字。
您应该考虑更改散列函数或者最多替换26位(2 ^ 26 = 67108864,2 ^ 27 = 134217728 - 已经有9位数)从输出向下舍入到3个字节(24位)并从这些位置获取Int32字节。
public int GetStableHash(string s)
{
...
byte[] hashValue = myhmacsha256.ComputeHash(contentBuffer);
byte[] hashPart = new byte[3];
hashValue.CopyTo(hashPart, 29); // 32-3
return System.BitConverter.ToInt32(hashPart, 0);
}
答案 1 :(得分:1)
unchecked
{
int num = BitConverter.ToInt32(hashValue,0);
if (num < 0)
{
num = -num;
}
num %= 100000000;
}
我正在使用unchecked
因为否则-int.MinValue
会中断(但请注意,通常程序是使用unchecked
“标记”“编译的”)
代码意味着:
unchecked
don't do overflow controls
if (num < 0)
{
num = -num;
}
make the number positive if negative
num %= 100000000;
take the remainder (that has 0-8 digits)
更短:
return unchecked((int)((uint)BitConverter.ToInt32(hashValue,0) % 100000000));