如何在Indy中使用Md5?

时间:2015-02-22 18:01:29

标签: delphi md5 indy

我需要计算MD5。在我搜索的任何地方,他们告诉我使用Indy,所以我有:

hasher := TIdHashMessageDigest5.Create;

现在,当我读取流时,我需要多次调用函数来更新MD5。我怎么能在Indy做到这一点?我只看到散列整个流的HashStream等方法。

在我计算我的哈希后,我需要将其转换为十六进制。我看到曾经是Indy中的AsHex功能,但它已不存在了。 那么如何将结果从像HashStream这样的函数转换为十六进制字符串?

1 个答案:

答案 0 :(得分:4)

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

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;

还有各种公共Hash...AsHex()方法,例如HashStreamAsHex()