You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi中对字符串做SHA256哈希以匹配C#哈希结果?

问题分析

你遇到的差异主要来自两个核心原因:

  1. 大小写差异:C#的BitConverter.ToString返回大写十六进制字符串,而Delphi默认哈希工具返回小写。
  2. 编码与类型不匹配:
    • 直接调用THashSHA2.GetHashString会使用系统默认编码(而非UTF-8)。
    • Indy组件的TIdHashSHA256.HashString要求使用Indy自身的IIdTextEncoding类型,而非系统的TEncoding,这是编译错误的根源。
解决方案

以下提供两种可行的Delphi实现,均能匹配C#版本的输出结果:

方案一:使用Delphi原生THashSHA2(无需第三方库)

直接控制编码转字节、哈希计算、十六进制格式化的全流程,完全对齐C#逻辑:

uses
  System.SysUtils, System.Hash;

function GetStringSha256Hash(const Text: string; const Encoding: TEncoding): string;
var
  Bytes: TBytes;
  HashBytes: TBytes;
  I: Integer;
begin
  Result := '';
  if Text.IsEmpty then Exit;

  // 将字符串转换为指定编码的字节数组
  Bytes := Encoding.GetBytes(Text);
  // 计算SHA256哈希
  HashBytes := THashSHA2.SHA256Hash(Bytes);
  // 模拟C# BitConverter.ToString的大写十六进制格式
  Result := '';
  for I := 0 to Length(HashBytes) - 1 do
    Result := Result + IntToHex(HashBytes[I], 2);
  Result := Result.ToUpper;
end;

// 使用示例(传入UTF-8编码)
var
  OutputHash: string;
begin
  OutputHash := GetStringSha256Hash('12345', TEncoding.UTF8);
  // 输出结果:1445217533E7D4D0CFFD9109C4EDB60D62A02C0F0DE9537BE44F5E00D348EB4F
end;

方案二:使用Indy的TIdHashSHA256(需引入Indy组件)

修正编码类型不匹配问题,并统一大小写:

uses
  IdHashSHA2, IdGlobal;

function GetStringSha256Hash(const Text: string): string;
var
  Hash: TIdHashSHA256;
begin
  Hash := TIdHashSHA256.Create;
  try
    // 使用Indy原生UTF-8编码,将哈希结果转为大写
    Result := UpperCase(Hash.HashStringAsHex(Text, TIdTextEncoding.UTF8));
  finally
    Hash.Free;
  end;
end;

// 使用示例
var
  OutputHash: string;
begin
  OutputHash := GetStringSha256Hash('12345');
  // 输出结果与C#版本一致
end;

内容的提问来源于stack exchange,提问作者GuidoG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:57:33