Laden...

String als eindeutigen Integer codieren

Erstellt von Lynix vor 12 Jahren Letzter Beitrag vor 12 Jahren 5.225 Views
L
Lynix Themenstarter:in
667 Beiträge seit 2004
vor 12 Jahren
String als eindeutigen Integer codieren

Hallo zusammen,

kennt jemand einen (Standard-)Algorithmus der mir einen String von fester Länge (z.B. 8 Zeichen) auf einen eindeutigen Integer-Wert abbildet ?

Es ist dabei nicht nötig, später den String wieder reproduzieren zu können, lediglich die generierte ID vom Typ integer muss eindeutig sein. Es wäre auch wünschenswert, dass die erzeugte Integer-Zahl eine fixe Anzahl von Dezimalstellen hat, wobei ggf. mit Nullen aufgefüllt werden kann aber eine bestimmte Obergrenze nicht überschritten werden darf.

Beispiel :

String-Eingabe : www.mycsharp.de
Erzeugte ID (≤ 10 Dezimalstellen) : 1234567890

Mit einem long-Wert müsste es denke ich z.B. so gehen:


private static long UrlToLong(string url)
    {
      int initialLength = url.Length;
      long value = 0;

      int lastXCharacters = 8;
      if (lastXCharacters > url.Length)
        lastXCharacters = url.Length; //if the url has less than 8 characters, ignore the lower decimal positions (keep them at zero)

      //start with the last character in the url
      for (int i = 1; i <= lastXCharacters; i++)
      {
        double ascii = (double)((int)url[url.Length - i]);
        double exp = Math.Pow(256, 8 - i);
        value += ((long)ascii * (long)exp);
      }

      return value;      
    }

Ein Integer hat allerdings einen zu kleinen Wertebereich für die obige Methode, weshalb ich mich gefragt habe, ob es dafür einen fertigen Encoding-Algorithmus gibt.

"It is not wise to be wise" - Sun Tzu

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo Lynix,

Stichwort: Hash-Algorithmus. Da gibts viele, nim dir einen davon.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

L
Lynix Themenstarter:in
667 Beiträge seit 2004
vor 12 Jahren

Hallo gfoidl,

ich hab im Vorfeld bereits danach gesucht, aber nur Algorithmen gefunden, die mir ein byte[] zurück liefern, damit kann ich aber nichts anfangen, da ich den codierten Wert unbedingt als Integer brauche.

Wenn Du einen speziellen Hash-Algorithmus kennst, der mir das liefern kann, wäre ich dankbar für eine detailliertere Antwort.

"It is not wise to be wise" - Sun Tzu

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Lynix,

mit der Eindeutigkeit ist es so eine Sache. Meinst du Int32? Da wird das schwierig. Ein Int32 hat einen Wertebereich von 232 (also grob 4 Milliarden). Ein String mit 8 Zeichen Länge aus einem einem Alphabet von sagen wir 64 (=26) verschiedenen Zeichen hat einen Wertebereich von 648=(26)8 = 2(6*8) = 248. Es müssten bzw. würden sich also im Schnitt je (248)/(232)=216 Strings dieselbe ID teilen.

Auf der anderen Seite liefern MD5 (128 Bit) oder SHA-1 (160 Bit) zwar auch keine garantiert eindeutigen Hashs, aber die Hashes sind mit so großer Wahrscheinlichkeit für alle praktisch vorkommenden Strings unterschiedlich, dass man sie guten Gewissens als ID verwenden kann.

32 Bits sind einfach zu wenig, außer du merkst dir die Strings der Reihe nach in einer Liste (ohne doppelte) und verwendest den Index als ID. Wenn es dabei um weniger als 4 Milliarden unterschiedliche Strings geht, passt es. In dem Fall ist sogar vollkommen egal, wie lang die Strings sind. Praktisch gesehen würde man natürlich keine Liste verwenden, sondern ein Dictionary<String,Int32>.

herbivore

175 Beiträge seit 2010
vor 12 Jahren

Wie wäre es mit

Adler-32 oder
Cyclic Redundancy Check

Bye,
Michael

Debuggers don't remove Bugs, they only show them in Slow-Motion.

L
Lynix Themenstarter:in
667 Beiträge seit 2004
vor 12 Jahren

Hallo herbivore,

das hab ich schon fast befürchtet, ist ja irgendwie auch logisch. Gibt es denn außer der URL etwas Anderes, Kürzeres, über dass sich eine Webseite eindeutig identifizieren lässt ? Ich denke mal, wenn ich nur noch 4 Zeichen der URL berücksichtige, ist eine Überlappung zweier Websites zu wahrscheinlich.

Zur Erklärung des Hintergrunds: Ich muss HTML-Elemente (Buttons, Textboxen, Links usw.) wieder erkennen können, und das über mehrere verschiedene HTML-Dokumente in ggf. mehreren verschiedenen InternetExplorer Instanzen hinweg. Daher wollte ich mir eine ID zu jedem gefundenen Element erstellen, die abhängig ist von der Webseite, in der das Element vorkommt (daher die URL) und von anderen unveränderlichen Eigenschaften des Objektes.

Die Einschränkung ist, dass ich ein "Handle" vom Typ integer brauche, das liegt an einer Schnittstelle, die ich nicht beeinflussen kann.

Als unveränderliche Eigenschaften stehen mir drei Zahlen zur Verfügung, zwei davon innrhalb eines Wertebereiches von -2000 bis + 2000 und eine innerhalb eines Wertebereiches von 0 bis 10000. Mit diesen drei Zahlen ist das HTML Element eindeutig INNERHALB EINES HTML-Dokumentes beschrieben. D.h. ich muss zusätzlich noch eine Information mitkodieren, durch die sich dann die erzeugten IDs aus Webseite 1 von denen aus Webseite 2 unterscheiden.

Vielleicht hat ja jemand eine Idee dazu...

@m.knigge

Danke, werde ich mir mal anschauen...

"It is not wise to be wise" - Sun Tzu

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Lynix,

also von 32Bit-Hashes würde ich aus den genannten Gründen die Finger lassen.

Möglicherweise haben sich deine Antwort und mein Edit meines Beitrags oben überschnitten. Evtl. ist das ja eine Lösung, die du verwenden kannst. Eine andere wird es auch kaum geben.

herbivore