Bei
Indy würde ich immer enUTF8 angeben, ansonsten wird wie bereits gesagt intern immer das
ASCII encoding genutzt, was einfach alle Zeichen größer $7F als '?' interpretiert - siehe TIdASCIIEncoding.GetBytes in IdGlobal.pas
Ebenso musst du bei
DEC dafür sorgen, dass er einen UTF8 String hasht und nicht einen UnicodeString (UTF16) - das kann man einfach mit einem Cast auf UTF8String bewerkstelligen, hier baut der Compiler immer die notwendige Konvertierungsfunktion ein. Durch die Überladung von CalcString mit RawByteString wird dann diese aufgerufen.
Delphi-Quellcode:
var lMD5_Indy := TIdHashMessageDigest5.Create;
try
var sValue := lMD5_Indy.HashStringAsHex('Tästwert', enUTF8);
Writeln(sValue);
finally
lMD5_Indy.Free;
end;
var lMD5_DEC := THash_MD5.Create;
try
var sValue := lMD5_DEC.CalcString(UTF8String('Tästwert'), TFormat_HEX);
Writeln(sValue);
finally
lMD5_DEC.Free;
end;
Ausgabe (Obacht, ich hab da nen ä in den String geschmuggelt, um das mit dem UTF8 zu testen):
9C6F9390DE3580AA8717DAA21D1E3622
9C6F9390DE3580AA8717DAA21D1E3622
Laut diverser online md5 Generatoren ist das wohl richtig.