zoukankan      html  css  js  c++  java
  • 关于 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;

    我们测试 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;

  • 相关阅读:
    编译
    Package vim is not available, but is referred to by another package.
    Http 请求处理流程 Asp.Net 编程 TraceFact.Net
    JavaScript中两个感叹号的作用
    IE6 链接失效 <a>失效 不能点击
    父元素绝对定位 子元素在IE6 不能点击
    ie6 ie7 绝对定位 相对定位 层被遮住
    HTTP深入浅出http请求
    主流的js template引擎 前端模板
    第3章:基本概念(一)
  • 原文地址:https://www.cnblogs.com/rtcmw/p/12678595.html
Copyright © 2011-2022 走看看