2013-05-15 77 views
2

最近,我注意到SHA算法计算随机长度的散列。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()进行转换,这似乎是一个巨大的错误。

回答

5

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

即使有这样的保证,UTF-8是一种可变长度编码:当将原始字节转换为Unicode字符时,每个字符“用尽”可变数量的字节(1到4),以便从这个代码在理论上可以在8和32之间的任何地方。

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

+0

所以不同的编码可以解决这个问题? ASCII? Unicode的?我刚刚看到使用ASCII,输出总是32个字符。随着Unicode,它是16. – Atrotygma

+0

问题是:*你想要做什么?* – Jon

+0

我的意图是生成一个随机和唯一的哈希用作标识符。在我的“真实”应用程序中,其他部分会散列以​​保证独特和随机性。上面的代码只是一个例子。我想要的是具有固定长度的十六进制字符的散列。但是这也是一个普遍的“编码/加密”问题,因为我还使用UTF8.GetString/UTF8.GetBytes和RSA密钥生成。 – Atrotygma