Zitat von
gammatester:
Ich weiß zwar nicht, was für Schweinerein in D2009 eingebaut sind, aber meine
CRC/Hash-Routinen laufen bis D2006/7 und Lazarus/FPC2.2.2 sogar unter Linux/ARM (in der PurPascal-Version).
Ich sehe also kein Problem für D2009 bzw. wäre interessiert an Hinweisen, falls es doch welche geben sollte.
Gruß Gammatester
Überprüfe mal alle Stellen, an denen du davon ausgehst, daß Sizeof(char) = 1 ist bzw. daß die Anzahl der Zeichen eines Strings gleich der Speichergröße dieses Strings ist.
Beispiel: MD5.pas - MD5SelfTest - SingleTest
Delphi-Quellcode:
function SingleTest(s: string; TDig: TMD5Digest): boolean;
{-do a single test, const not allowed for VER<7}
{ Two sub tests: 1. whole string, 2. one update per char}
var
i: integer;
begin
SingleTest := false;
{1. Hash complete string}
MD5Full(Digest, @s[1],length(s));
{Compare with known value}
if not HashSameDigest(@MD5_Desc, PHashDigest(@Digest), PHashDigest(@TDig)) then exit;
{2. one update call for all chars}
MD5Init(Context);
for i:=1 to length(s) do MD5Update(Context,@s[i],1);
MD5Final(Context,Digest);
{Compare with known value}
if not HashSameDigest(@MD5_Desc, PHashDigest(@Digest), PHashDigest(@TDig)) then exit;
SingleTest := true;
end;
Der Aufruf von MD5Full wird unter D2009 etwas anders ausgehen, als noch unter D2007. Eine Lösung, die in beiden Fällen läuft wäre
MD5Full(Digest, @s[1], length(s)*sizeof(Char));
Allerdings glaube ich kaum, daß die Hashwerte eines AnsiStrings mit denen eines UnicodeStrings übereinstimmen, welbst wenn sie die gleiche Zeichenfolge enthalten.