|
使用Indy自带的md5算法,代码如下:
uses IdHash, IdHashMessageDigest;
function GetStringMD5(const AInPut: string): string;
var
MD5: TIdHashMessageDigest5;
{$IF CompilerVersion<20.0}
Digest: T4x4LongWordRecord;
{$IFEND}
begin
MD5 := TIdHashMessageDigest5.Create;
try
{$IF CompilerVersion>20.0} // Delphi 2009 +
Result := LowerCase(MD5.HashStringAsHex(AInPut));
{$ELSE}
Digest := MD5.HashValue(AInPut);
Result := LowerCase(MD5.AsHex(Digest));
{$IFEND}
finally
MD5.Free;
end;
end;
我们测试 GetStringMD5(123abc) ,MD5值为:a906449d5769fa7361d7ecc6aa3f6d28 ,和在线MD5得到结果一致。
procedure TForm1.btnMD5Click(Sender: TObject);
begin
Edit2.Text := GetStringMD5(Edit1.Text);
end;
如果包含中文,比如:GetStringMD5('123abc你好'),则MD5值就不对了。
其实算法没问题,是编码的问题。一般MD5都是使用UTF8编码,使用的时候需要把字符串转换为UTF8编码:
ShowMessage(GetStringMD5(UTF8Encode('123abc你好')));
MD5值为:d9926163f751c6c2e6393bc332a5c814
如果使用 Delphi XE8 以上版本的 System.Hash.THashMD5,就不需要UTF8转换了,因为内部已经做了转换:
procedure THashMD5.Update(const Input: string);
begin
Update(TEncoding.UTF8.GetBytes(Input));
end;
只要这样就可以了:
ShowMessage(System.Hash.THashMD5.GetHashString('123abc你好'));
为了使用方便,把 GetStringMD5 修改一下,使用的时候就不用UTF8Encode转换了。
function GetStringMD5(const AInPut: string): string;
var
MD5: TIdHashMessageDigest5;
{$IF CompilerVersion<20.0}
Digest: T4x4LongWordRecord;
{$IFEND}
begin
MD5 := TIdHashMessageDigest5.Create;
try
{$IF CompilerVersion>20.0} // Delphi 2009 +
Result := LowerCase(MD5.HashStringAsHex(AInPut));
{$ELSE}
Digest := MD5.HashValue(UTF8Encode(AInPut));
Result := LowerCase(MD5.AsHex(Digest));
{$IFEND}
finally
MD5.Free;
end;
end;
作者:
oldfarmer
出处:
http://www.cnblogs.com/rtcmw/
欢迎探讨交流 DELPHI 相关技术,QQ:64445322 QQ群:734515869
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
来源:https://www.cnblogs.com/rtcmw/p/12678595.html |