Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
Delphi 12 Athens
|
Re: Hashberechnung der Topologie eines Wortes - wie?
21. Mai 2010, 15:14
Hab auch mal ein bissl gespielt (jetzt steckt mich Hagen schon mit seinen Primzahlen an )
Nja, rausgekommen ist sowas, welches hoffentlich aus den doppelten Buchstaben/Zeichen 'ne Zahl erstellt, welche das zugrundeliegende Verteilungsmuster enthält.
Delphi-Quellcode:
{$OVERFLOWCHECKS ON}
{$RANGECHECKS ON}
function CreateID(S: String): UInt64;
const
Prim: array[1..30] of Integer = (2, 3, 5, 7, 11, 13, 17, 19, 23, 29,
31, 37, 41, 43, 47, 53, 59, 61, 67, 71,
73, 79, 83, 89, 97, 101, 103, 107, 109, 113);
var
i, i2: Integer;
begin
Result := 0;
S := AnsiLowerCase(S);
for i := 1 to Length(S) do
begin
i2 := i;
while PosEx(S[i], S, i2 + 1) > 0 do
begin
i2 := PosEx(S[i], S, i2 + 1);
Result := Result + Trunc(Power(Prim[i], i2 - i));
// [edit] vielleicht doch lieber so? :gruebel:
// Result := Result + Trunc(Power(Prim[i], Prim[i2 - i + 1]));
end;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
S: String;
begin
S := 'Butterbrot';
ShowMessage(Format('%d-%d', [Length(S), CreateID(S)]));
end;
Das -i im Power ist nur da, um das Ergebnis ein bissl kleiner werden zu lassen, da hier nicht der Gesamtoffset im String, sondern nur das Offset zum 1. gleichen Zeichen verwendet wird.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
|