2010-10-29 11 views
11

Ich muss einige Zeichenfolgen hashen, damit ich sie in einige Bibliotheken übergeben kann, dies ist einfach mit dem String.hashCode Aufruf.Konvertiere String in Hash und reformiere den String dann später

Aber sobald alles verarbeitet wird, möchte ich die aus dem HashCode generierte Ganzzahl wieder in den String-Wert konvertieren. Ich könnte natürlich die String- und Hashcode-Werte irgendwo anders verfolgen und die Konvertierung dort durchführen, aber ich frage mich, ob es irgendwas in Java gibt, das das automatisch macht.

+1

Sie können dafür Verschlüsselung oder Kodierung/Dekodierung (vielleicht base64) verwenden. – jerjer

Antwort

25

Ich glaube, Sie missverstehen das Konzept eines Hash. Ein Hash ist eine Einwegfunktion. Schlimmer noch, zwei Strings können den gleichen Hash erzeugen.

Also nein, es ist nicht möglich.

+1

Außerdem ist das in erster Linie der Punkt eines Hashes. –

7

Das ist im Allgemeinen nicht möglich. Die hashCode ist, was man eine one-way-function nennen würde.

Außerdem gibt es mehr Zeichenketten als ganze Zahlen, daher gibt es eine Eins-zu-viele-Zuordnung von Ganzzahlen zu Zeichenketten. Die Strings "0-42L" und "0-43-" haben zum Beispiel denselben Hash-Code. (Demonstration on ideone.com.)

Was Sie könnte tun jedoch (als Schätzung), wäre die Saiten Sie in die API übergeben speichern und erinnern sich an ihre Hash-Codes wie folgt aus:

import java.util.*; 

public class Main { 
    public static void main(String[] args) { 

     // Keep track of the corresponding strings 
     Map<Integer, String> hashedStrings = new HashMap<Integer, String>(); 

     String str1 = "hello"; 
     String str2 = "world"; 

     // Compute hash-code and remember which string that gave rise to it. 
     int hc = str1.hashCode(); 
     hashedStrings.put(hc, str1); 

     apiMethod(hc); 

     // Get back the string that corresponded to the hc hash code. 
     String str = hashedStrings.get(hc); 
    } 
} 
+0

eine Ergänzung zu diesem Ansatz könnte BiDiMap (http://commons.apache.org/collections/api-3.1/org/apache/commons/collections/BidiMap.html) sein, wenn Sie Reverse-Lookups durchführen müssen. Achten Sie nur auf Hash-Kollisionen .. :) – posdef

+0

Es wäre am besten, eine Karte > zu verwenden. Auf diese Weise können Sie Ihre Hashes den entsprechenden Strings zuordnen, da diese mehrere sein können. – Carra

+0

Das ist ein guter Punkt. Er müsste aber immer noch zwischen den Strings "List " raten, die einem bestimmten Hash-Code entsprachen. – aioobe

1

Nicht möglich um die .hashcode() Ausgabe in die ursprüngliche Form zu konvertieren. Es ist ein einseitiger Prozess.

Sie können eine base64 encoder scheme verwenden, wo Sie die Daten verschlüsseln, verwenden Sie es wo immer Sie wollen und dann dekodieren Sie es in das ursprüngliche Formular.

6

hashCode() ist ein bijection im Allgemeinen nicht, weil es im Allgemeinen nicht eine injective Karte sein wird.

hashCode() hat int s als seine Reichweite. Es gibt nur 2^32 verschiedene int Werte, so dass für jedes Objekt, wo es mehr als 2^32 verschiedene geben kann (zB denken Sie an Long), sind Sie garantiert (durch die pigeonhole principle, dass mindestens zwei verschiedene Objekte haben gleichen Hash-Code.

die einzige Garantie, dass hashCode() Sie gibt, ist, dass, wenn a.equals(b), dann a.hashCode() == b.hashCode(). Jedes Objekt den gleichen Hash-Code aufweist, ist im Einklang mit diesem.

Sie können verwenden die hashCode() zur eindeutigen Identifikation von Objekten in einigen sehr begrenzten Umständen: Sie müssen eine bestimmte Klasse haben, in der es keinen mor gibt e als 2^32 mögliche unterschiedliche Instanzen (d. h. es gibt höchstens 2^32 Objekte Ihrer Klasse, die paarweise so sind, dass !a.equals(b)). In diesem Fall, solange Sie sicherstellen, dass immer !a.equals(b) und a und b Objekte Ihrer Klasse sind, nämlich a.hashCode() != b.hashCode(), haben Sie eine Bijektion zwischen (Äquivalenzklassen von) Objekten und Hash-Codes. (So ​​könnte es beispielsweise für die Klasse Integer gemacht werden.)

Wenn Sie jedoch nicht in diesem speziellen Fall sind, sollten Sie eine eindeutige ID auf andere Weise erstellen.

+0

+1 für das Herbeiführen des Fachprinzips. – ArtOfWarfare

Verwandte Themen