Somit wird also m.E. der Longword-Bestandteil (möglicher Wertebereich 0..99999) der
GUID als Hash-Basis verwendet.
Und das ist der Grund für die ganzen Kollisionen 420.000 Werte teilen sich 10.000 Hashwerte.
Im Grund ähnlich den Pointern von Sir Rufo.
Nur das du eben einen Kollisionsautomaten verwendest
Probier doch mal diesen Comparer
Delphi-Quellcode:
{ TGuidEqualityComparer }
function TGuidEqualityComparer.Equals(const Left, Right: TGuid): Boolean;
begin
Result := (Left = Right);
end;
function TGuidEqualityComparer.GetHashCode(const Value: TGuid): Integer;
begin
Result := 17;
Result := Result * 397 + FC;
Result := Result * 397 + BobJenkinsHash( FTS1, sizeOf( TDateTime ), 5 );
Result := Result * 397 + BobJenkinsHash( FTS2, sizeOf( TDateTime ), 7 );
end;
und du wirst Pipi in die Augen bekommen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)