C# 固定长度散列

C# 固定长度散列,c#,hash,C#,Hash,我正在尝试使用下面的代码生成一个固定长度的散列 public int GetStableHash(string s) { string strKey = "myHashingKey"; UnicodeEncoding UE = new UnicodeEncoding(); byte[] key = UE.GetBytes(strKey); byte[] contentBuffer =

我正在尝试使用下面的代码生成一个固定长度的散列

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位)。有人能告诉我怎么做吗


提前感谢。

您正在尝试从哈希函数输出中获取一个8位数的数字,该数字最多可包含

lg(2^256)~78

十进制数字

你应该考虑改变哈希函数或替换多达26位(2 ^ 26=67108864, 2 ^ 27=134217728—9位)从输出舍入到3字节(24位),并从这些3字节获得It32。

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);
}

您试图从哈希函数输出中获取一个8位数的数字,该数字最多可包含

lg(2^256)~78

十进制数字

你应该考虑改变哈希函数或替换多达26位(2 ^ 26=67108864, 2 ^ 27=134217728—9位)从输出舍入到3字节(24位),并从这些3字节获得It32。

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);
}
短得多:

return unchecked((int)((uint)BitConverter.ToInt32(hashValue,0) % 100000000));
短得多:

return unchecked((int)((uint)BitConverter.ToInt32(hashValue,0) % 100000000));

在这一行“hashValue.CopyTo(hashPart,230);//256-26”中,我得到以下异常“目标数组不够长。请检查destIndex和长度,以及数组的下限。”。hashValue只有32个字节,所以我把它改为从9开始,而不是从230开始,但异常仍然在抛出。其次,如果忽略一些字节,您认为它是有效的哈希吗?我对这个想法有点困惑。啊,对不起。26位=>3字节(24位,向下舍入,因为4字节整数很容易超过8位)。更正了我的答案和密码。这将是一个有效的散列,只是碰撞概率将高得多。不管怎么说,如果你有8位小数的限制,你就没有比这更好的了。我不明白问题出在哪里:这还是一个例外。甚至我也尝试使用hashValue.CopyTo(hashPart,30);还有31:(您能运行这段代码吗?在这一行“hashValue.CopyTo(hashPart,230);//256-26”我得到以下异常“目标数组不够长。请检查destinex和length,以及数组的下限。”.hashValue只有32个字节,所以我将它改为从9开始,而不是从230开始,但仍然引发异常。其次,如果我们忽略一些字节,您认为它是有效的哈希吗?我对这个想法有点困惑。啊,对不起。26位=>3字节(24位,向下舍入,因为4字节整数很容易超过8位)。更正了我的答案和代码。这将是一个有效的哈希,因为冲突概率将高得多。无论如何,如果限制为8位十进制数字,则不会有任何明显的改进。我不明白问题是什么:仍然是相同的例外。即使我尝试使用hashValue.CopyTo(hashPart,30);以及31:(你能运行这段代码吗?这很好,但我有一个问题。余数后的输出是有效的散列吗?就像散列是唯一的(我想),但两个10位数字的余数可以是相同的。所以再说一遍“它会是有效的散列吗”?如果我混淆了一些东西,很抱歉。@MujtabaHassan散列不是“唯一的”。在统计上很难复制(它有各种属性可以保证)。完整的SHA1散列长度为160位。你拿走的位越多,就越容易找到具有相同散列的第二个对象。这很好,但我有一个问题。剩余部分后的输出是有效的散列吗?就像散列是唯一的一样(我认为)但是两个10位数字的剩余部分可以是相同的。所以,请再说一遍“它是有效的哈希吗”?如果我混淆了一些东西,请原谅。@MujtabaHassan哈希不是“唯一的”。它在统计上很难复制(它有各种属性保证它)。完整的SHA1哈希长度为160位。删除的位越多,越容易找到具有相同哈希的第二个对象。