关于 Delphi 7 中文MD5的问题
<p>使用Indy自带的md5算法,代码如下:</p><div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">uses IdHash, IdHashMessageDigest;
</span><span style="color: rgba(0, 0, 255, 1)">function</span> GetStringMD5(<span style="color: rgba(0, 0, 255, 1)">const</span> AInPut: <span style="color: rgba(0, 0, 255, 1)">string</span>): <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
MD5: TIdHashMessageDigest5;
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IF CompilerVersion<20.0</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
Digest: T4x4LongWordRecord;
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IFEND</span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
MD5 :</span>= TIdHashMessageDigest5.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IF CompilerVersion>20.0</span><span style="color: rgba(0, 128, 0, 1)">}</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Delphi 2009 +</span>
Result :=<span style="color: rgba(0, 0, 0, 1)"> LowerCase(MD5.HashStringAsHex(AInPut));
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$ELSE</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
Digest :</span>=<span style="color: rgba(0, 0, 0, 1)"> MD5.HashValue(AInPut);
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> LowerCase(MD5.AsHex(Digest));
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IFEND</span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
MD5.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p><img src="https://img2020.cnblogs.com/blog/1013147/202004/1013147-20200417092418590-28894152.png"></p>
<p>我们测试 GetStringMD5(123abc) ,MD5值为:a906449d5769fa7361d7ecc6aa3f6d28 ,和在线MD5得到结果一致。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">procedure</span><span style="color: rgba(0, 0, 0, 1)"> TForm1.btnMD5Click(Sender: TObject);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Edit2.Text :</span>=<span style="color: rgba(0, 0, 0, 1)"> GetStringMD5(Edit1.Text);
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>如果包含中文,比如:GetStringMD5('123abc你好'),则MD5值就不对了。</p>
<p><img src="https://img2020.cnblogs.com/blog/1013147/202004/1013147-20200417093248466-75179323.png"></p>
<p>其实算法没问题,是编码的问题。一般MD5都是使用UTF8编码,使用的时候需要把字符串转换为UTF8编码:</p>
<div class="cnblogs_code">
<pre>ShowMessage(GetStringMD5(UTF8Encode(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">123abc你好</span><span style="color: rgba(128, 0, 0, 1)">'</span>)));</pre>
</div>
<p>MD5值为:d9926163f751c6c2e6393bc332a5c814</p>
<p>如果使用 Delphi XE8 以上版本的 System.Hash.THashMD5,就不需要UTF8转换了,因为内部已经做了转换:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">procedure</span> THashMD5.Update(<span style="color: rgba(0, 0, 255, 1)">const</span> Input: <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
Update(TEncoding.UTF8.GetBytes(Input));
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p>只要这样就可以了:</p>
<div class="cnblogs_code">
<pre>ShowMessage(System.Hash.THashMD5.GetHashString(<span style="color: rgba(128, 0, 0, 1)">'123abc你好</span><span style="color: rgba(128, 0, 0, 1)">'</span>));</pre>
</div>
<p>为了使用方便,把 GetStringMD5 修改一下,使用的时候就不用UTF8Encode转换了。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">function</span> GetStringMD5(<span style="color: rgba(0, 0, 255, 1)">const</span> AInPut: <span style="color: rgba(0, 0, 255, 1)">string</span>): <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span><span style="color: rgba(0, 0, 0, 1)">
MD5: TIdHashMessageDigest5;
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IF CompilerVersion<20.0</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
Digest: T4x4LongWordRecord;
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IFEND</span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">begin</span><span style="color: rgba(0, 0, 0, 1)">
MD5 :</span>= TIdHashMessageDigest5.<span style="color: rgba(0, 0, 255, 1)">Create</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">try</span>
<span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IF CompilerVersion>20.0</span><span style="color: rgba(0, 128, 0, 1)">}</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Delphi 2009 +</span>
Result :=<span style="color: rgba(0, 0, 0, 1)"> LowerCase(MD5.HashStringAsHex(AInPut));
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$ELSE</span><span style="color: rgba(0, 128, 0, 1)">}</span><span style="color: rgba(0, 0, 0, 1)">
Digest :</span>=<span style="color: rgba(0, 0, 0, 1)"> MD5.HashValue(UTF8Encode(AInPut));
Result :</span>=<span style="color: rgba(0, 0, 0, 1)"> LowerCase(MD5.AsHex(Digest));
</span><span style="color: rgba(0, 128, 0, 1)">{</span><span style="color: rgba(0, 128, 0, 1)">$IFEND</span><span style="color: rgba(0, 128, 0, 1)">}</span>
<span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)">
MD5.Free;
</span><span style="color: rgba(0, 0, 255, 1)">end</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">end</span>;</pre>
</div>
<p> </p>
<p></audio></p>
</div>
<div id="MySignature" role="contentinfo">
<div id="AllanboltSignature">
<p style="border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-top: 5px; padding-right: 10px; padding-bottom: 10px; padding-left: 60px; background: url("https://images.cnblogs.com/cnblogs_com/lloydsheng/239039/o_copyright.gif") #e5f1f4 no-repeat 1% 50%; font-family: 微软雅黑; font-size: 11px" id="PSignature">
<br>作者:
oldfarmer
<br>出处:
http://www.cnblogs.com/rtcmw/
<br> 欢迎探讨交流 DELPHI 相关技术,QQ:64445322 QQ群:734515869
<br>本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。</p>
</div>
<div>
</div><br><br>
来源:https://www.cnblogs.com/rtcmw/p/12678595.html
頁:
[1]