散列后为什么是负值?

时间:2013-11-15 00:32:00

标签: c#

有人可以建议,为什么在计算哈希之后,将负值存储到e?

static byte[] bytes;
BigInteger[] numbers = {A, ANeg, Aseed, AseedNeg, C1, C2, C1Neg, C2Neg};
foreach (BigInteger number in numbers)
{
    bytes = number.ToByteArray();
}
SHA1 sha = new SHA1CryptoServiceProvider();
hash = sha.ComputeHash(bytes);
e = new BigInteger(hash);

2 个答案:

答案 0 :(得分:0)

出于同样的原因,“ - 3”是否定的,“2”不是;用于表示数字低于零的符号是:在有人写下“-3”的情况下,这是“ - ”。对于BigInteger,这是最重要的一点。

答案 1 :(得分:0)

MSDN上的BigInteger(byte[]) constructor documentation提供以下内容:

  

如果设置了最高位字节的最高位,则生成的BigInteger值为负

  

为防止将正值误解为负值,可以在数组末尾添加零字节值。

应用文档:

    如果e中的最后一个字节(即hash)大于0x7f(127),则
  1. hash[hash.Length - 1]将为负数。

  2. 要将hash的值解释为无符号数,请在hash的末尾添加零字节值,例如

    e = new BigInteger(hash.Concat(new byte[]{0}).ToArray());