我需要计算MD5。在我搜索的任何地方,他们告诉我使用Indy,所以我有:
hasher := TIdHashMessageDigest5.Create;
现在,当我读取流时,我需要多次调用函数来更新MD5。我怎么能在Indy做到这一点?我只看到散列整个流的HashStream等方法。
在我计算我的哈希后,我需要将其转换为十六进制。我看到曾经是Indy中的AsHex功能,但它已不存在了。 那么如何将结果从像HashStream这样的函数转换为十六进制字符串?
答案 0 :(得分:4)
TIdHashMessageDigest...
(和TIdHashSHA...
)目前没有public
直播哈希方法(TIdHashCRC...
,TIdHashAdler32
和TIdHashElf
做)。但是,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()
。