1. 程式人生 > WINDOWS開發 >關於 Delphi 7 中文MD5的問題

關於 Delphi 7 中文MD5的問題

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

我們發現這個函式處理數字和英文是正確的,如果包含中文,則MD5值和其他語言對不上了,其實演算法沒問題,是編碼的問題。一般MD5都是使用UTF8編碼,使用的時候需要把字串轉換為UTF8編碼:

ShowMessage(GetStringMD5(UTF8Encode(
中文)));

MD5值為:a7bac2239fcdcb3a067903d8077c4a07

如果Delphi XE8 以上版本的System.Hash.THashMD5,就不需要UTF8轉換了,內部已經做了轉換:

procedure THashMD5.Update(const Input: string);
begin
  Update(TEncoding.UTF8.GetBytes(Input));
end;

只要這樣就可以了:

ShowMessage(System.Hash.THashMD5.GetHashString(中文));