Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#8

Re: Hashberechnung der Topologie eines Wortes - wie?

  Alt 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.
  Mit Zitat antworten Zitat