我如何在 Indy 中使用 Md5?

How do I use Md5 in Indy?

我需要计算MD5。我搜索的每个地方都告诉我使用 Indy,所以我有:

hasher := TIdHashMessageDigest5.Create;

现在我需要在读取流时多次调用一个函数来更新 MD5。我怎样才能在 Indy 中做到这一点?我只看到像 HashStream 这样的方法对整个流进行哈希处理。

另外,在我计算完哈希后,我需要将它转换为十六进制。我看到 Indy 中曾经有 AsHex 函数,但现在不存在了。 那么如何将 HashStream 等函数的结果转换为十六进制字符串?

TIdHashMessageDigest...(和TIdHashSHA...)目前没有public直播流哈希方法(TIdHashCRC...TIdHashAdler32TIdHashElf 做)。但是,TIdHashMessageDigest... 确实有 protected 直播方法,因此您可以使用访问器 class 访问它们,例如:

type
  TIdMessageDigest5Access = class(TIdMessageDigest5)
  end:

var
  hasher: TIdMessageDigest5:
  ctx: TIdHashIntCtx;
  hash: TIdBytes;
  hex: string;
begin
  hasher := TIdHashMessageDigest5.Create;
  ctx := TIdMessageDigest5Access(hasher).InitHash;
  ...
  // call this as many times as needed...
  TIdMessageDigest5Access(hasher).UpdateHash(ctx, bytes);
  ...
  hash := TIdMessageDigest5Access(hasher).FinalHash(ctx);
  hex := TIdMessageDigest5Access(hasher).HashToHex(hash);
  ...
  hasher.Free;
end;

还有各种publicHash...AsHex()方法,比如HashStreamAsHex().