当我23
使用MD5加密加密时,我得到37693cfc748049e45d87b8c7d8b9aacd
这个32个字符长的字符串,它总是23个为静态字符串.
我想要相同类型的机制,但应该生成18个或更少(如:)122ff1e4883358b6
字符长字符串而不是32.
我怎样才能在C#中做到这一点,c#中是否有更短版本的MD5?
我喜欢@ RichieHindle的回答.但是,如果您有兴趣丢失较少的保真位(从而降低冲突风险),您可以获取MD5哈希返回的128位值,并使用ASCII85(也称为Base85编码)对其进行编码,基于十六进制的编码.这将为您提供20个字节的整个哈希值(这比您想要的更多,但是您可以关闭2个字节,与使用十六进制编码删除的32个字节中的14个相比,所产生的损失要小得多).
编辑: Prashant说20个字符足够接近,并要求提供示例代码:
从MD5.ComputeHash调用获取MD5哈希后,您可以使用Jeff Atwood的ASCII85编码器:
MD5 m = MD5.Create(); byte[] hash = m.ComputeHash(System.Text.Encoding.ASCII.GetBytes("23")); Ascii85 encoder = new Ascii85(); encoder.EnforceMarks = false; string hash85 = encoder.Encode(hash); Console.Out.WriteLine(hash85);
产量
2ebDPFFZsD?&,r1fX\$,
所以你可以使用hash85
.将encoder.EnforceMarks
可确保编码不包括与ASCII85相关的一些典型的前缀和后缀.
您可以根据需要尽可能多地使用MD5哈希值,然后将其余部分丢弃.所有位都具有相同的值,因此在执行此操作与使用本机产生较少位的一些散列算法之间没有区别.
(如果出于安全原因这样做,请记住,无论算法如何,更少的位都会使哈希更容易破解.即使在安全应用程序之外,更少的位也会增加冲突的风险.另外请记住,MD5相对不安全天 - SHA-1或SHA-2被认为更安全.)
MD5始终创建128位哈希.
其他较小的Hashtypes(取自维基百科)
Fowler-Noll-Vo散列函数(32,64,128,256,512或1024位)
Jenkins散列函数(32位)
MurmurHash(32或64位)
Pearson散列(8位)
但请记住哈希冲突