2011-03-07 126 views
0

可能重复:
Hash Function .NETHash函数.NET

喜,

我应该写一个应用程序,采取串输入的字符串计算哈希值(输入的最大字符数为16),则输出的长度应为22个字符(或更少,但不能超过64位)。

我看到.NET框架提出了几个散列函数,我不知道该用什么, 有没有人向我推荐什么是最好的函数使用,以及如何限制输出为22个字符(在base64上)?

感谢

+0

你到底发布了同样的问题两次! – 2011-03-07 07:17:59

+0

@Marcelo - 为了公平起见,他确实指定*“(在base64上)”*。 – ChaosPandion 2011-03-07 07:19:02

+0

如果您在其中一个问题中出现错误,您可以使用问题下方的编辑按钮来更改您的问题。 – 2011-03-07 07:23:02

回答

4

你可以使用任何的散列函数的,只是截断散列到所需的大小,然后转换为基于64位。在你的情况下,你需要截断散列为15个字节,最终为20个字节的base-64。我将重用我之前的例子。

string secretKey = "MySecretKey"; 
string salt = "123"; 
System.Security.Cryptography.SHA1 sha = System.Security.Cryptography.SHA1.Create(); 
byte[] preHash = System.Text.Encoding.UTF32.GetBytes(secretKey + salt); 
byte[] hash = sha.ComputeHash(preHash); 
string password = prefix + System.Convert.ToBase64String(hash, 0, 15); 
+0

是的,但我希望确保diffrents字符串不给我同一HASE,trunncat了出来放是我给冲突的风险,你能解释我为什么要定义的“盐”,为什么不能只使用了“秘密密钥”? – RRR 2011-03-07 07:31:43

+1

salt给散列输出增加了一个随机性。这不是强制性的,但如果你的数据需要安全,建议多加一些盐​​。截断不会比其他方式增加碰撞。毕竟,您的要求是22个字节的长度。你最终将不得不截断这种或那种方式。另一种方法是在散列之前进行压缩,如果您认为增加的复杂性不是问题,但是碰撞的风险是。 – 2011-03-07 07:45:50

+0

@RRR,如果转换为base-64,那么您的16字节输入将得到24个字节。 – 2011-03-07 08:03:46