2

最近,我注意到 SHA 算法计算随机长度的哈希。

HashAlgorithm provider;
provider = HashAlgorithm.Create("System.Security.Cryptography.SHA256");

while(!stackoverflow) {
    Console.WriteLine(Encoding.UTF8.GetString(
         provider.ComputeHash(Encoding.UTF8.GetBytes(
              (new Random()).Next().ToString())))
         .Count().ToString());
}

输出:

29
29
30
29
29
30
29
31
29
29
32
29
30
28
...

是否可以设置最大哈希长度?(可以使散列无用..)或者我在计算散列时做错了什么?编码?

编辑:

上面的片段只是一个例子。最后我需要的是一个方法,它接受一个字符串,计算字符串的哈希值并返回它。HashAlgorithm.ComputeHash接受字节并返回字节,所以我使用UTF8.GetBytes()/UTF8.GetString()进行转换,这似乎是一个巨大的错误。

4

1 回答 1

5

SHA1-256 哈希总是 32 字节长。您在这里所做的是试图将这些字节解释为 UTF-8 编码文本,这是完全错误的,因为绝对不能保证哈希字节是有效的 UTF8 编码序列。

即使有这样的保证,UTF-8 也是一种可变长度编码:当将原始字节转换为 Unicode 字符时,您“用尽”每个字符的可变字节数(1 到 4),因此该代码的输出理论上可以介于 8 到 32 之间。

一般来说,这个例子没有意义。请澄清你的意图是什么。

于 2013-05-15T09:59:17.520 回答