当前位置:  开发笔记 > 编程语言 > 正文

C#:如何生成短MD5代码?

如何解决《C#:如何生成短MD5代码?》经验,为你挑选了3个好方法。

当我23使用MD5加密加密时,我得到37693cfc748049e45d87b8c7d8b9aacd这个32个字符长的字符串,它总是23个为静态字符串.

我想要相同类型的机制,但应该生成18个或更少(如:)122ff1e4883358b6字符长字符串而不是32.

我怎样才能在C#中做到这一点,c#中是否有更短版本的MD5?



1> Blair Conrad..:

我喜欢@ 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相关的一些典型的前缀和后缀.


好吧,这很好,但是输出包含特殊字符(?,&etc)但是我想传递这个在URL中的字符串作为参数,以便在下一页上我可以解密它并向用户显示输出,类似于gmail正在做`mail.google.com/mail/?zx = 1xjighs8u7ewc&shva = 1#inbox/1230e772c539f5e3`.如果我通过?或者在&url中然后会产生问题.我们不能从最终输出中删除特殊字符以生成类似"1230f774c459b5f3"的输出(没有特殊字符??

2> RichieHindle..:

您可以根据需要尽可能多地使用MD5哈希值,然后将其余部分丢弃.所有位都具有相同的值,因此在执行此操作与使用本机产生较少位的一些散列算法之间没有区别.

(如果出于安全原因这样做,请记住,无论算法如何,更少的位都会使哈希更容易破解.即使在安全应用程序之外,更少的位也会增加冲突的风险.另外请记住,MD5相对不安全天 - SHA-1或SHA-2被认为更安全.)


但这不会增加碰撞的机会吗?我不是密码学方面的专家,但是抛出一部分哈希并仍然期望它保持其属性似乎是一个坏主意.
如果值始终小于散列大小,则可以轻松创建不会发生冲突的散列.只有当数据的大小大于散列的大小时,冲突才是固有的,因为每个可能的输入都不能一对一地映射到不同的散列值.
你无法使_always_唯一 - 它是一个哈希,根据定义它有冲突.你做的越短,碰撞就越可能.
托马斯:嗯,无论如何都会发生.较短的哈希本身具有较高的冲突机会.

3> Henrik P. He..:

MD5始终创建128位哈希.

其他较小的Hashtypes(取自维基百科)

Fowler-Noll-Vo散列函数(32,64,128,256,512或1024位)
Jenkins散列函数(32位)
MurmurHash(32或64位)
Pearson散列(8位)

但请记住哈希冲突

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有