查看: 27|回复: 0

关于 Delphi 7 中文MD5的问题

[复制链接]

3

主题

0

回帖

0

积分

热心网友

金币
0
阅读权限
220
精华
0
威望
0
贡献
0
在线时间
0 小时
注册时间
2009-7-19
发表于 2020-4-11 11:53:00 | 显示全部楼层 |阅读模式

使用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;

 

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部