Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 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.
$2B or not $2B
|