Word.word2hash()

Forum for developers

Word.word2hash()

Beitragvon apfelmaennchen » Sa Jun 06, 2009 12:24 pm

Also ich glaub ich bin zu blöd...

word2hash(WORT) liefert einen byte[] Hash für WORT, den ich als String ablegen möchte (weil ich MapView nutze und ich da keinen Byte Hash nutzen kann).

1. Problem:
String a = word2hash(WORT).toString();
String b= new String(word2hash(WORT));
a.equals(b) ==> false


2. Problem:
a.getBytes() != b.getBytes() ==> klar, a ist ja auch ungleich b
a.getBytes() != word2hash(WORT);
b.getBytes() != word2hash(WORT);
Base64Order.enhancedCoder.decode(a, info) != word2hash(WORT);
Base64Order.enhancedCoder.decode(b, info) != word2hash(WORT);


Wie bekomme ich also jetzt aus meinem String Hash wieder einen Byte Hash?
Es geht nicht darum, wieder den String WORT zu bekommen, ich weiss also schon was eine Hash-Funktion macht ;-)

Gruß!
apfelmaennchen

EDIT: getBytes("UTF-8") und getBytes("UTF-16") lösen das Problem auch nicht ...
apfelmaennchen
 
Beiträge: 429
Registriert: Mo Aug 20, 2007 7:06 pm

Re: Word.word2hash()

Beitragvon Orbiter » Sa Jun 06, 2009 12:50 pm

> String a = word2hash(WORT).toString();
das geht nicht, so kannst du byte[] nicht zu Strings umwandeln, da kommt b[... oder so ähnlich raus, wie in manchen Bugs hier. Das ist so, weil Java da den Pointer zum byte[] als String darstellt.

> String b= new String(word2hash(WORT));
das ist ok.

> a.getBytes() != b.getBytes() ==> klar, a ist ja auch ungleich b
geht nicht weil a falsch ist

> a.getBytes() != word2hash(WORT);
ebenso

> b.getBytes() != word2hash(WORT);
geht nicht, weil du hier die Pointer der byte[] vergleichst
Die sind unterschiedlich, auch wenn der byte[] gleichen Inhalt hat.

> Base64Order.enhancedCoder.decode(a, info) != word2hash(WORT);
s.o. a ist falsch

> Base64Order.enhancedCoder.decode(b, info) != word2hash(WORT);
auch hier vergleichst du nur die Pointer

> Wie bekomme ich also jetzt aus meinem String Hash wieder einen Byte Hash?
b.getBytes()
das ist richtig, aber ein Vergleich mit == scheitert ebenfalls richtigerweise.
Die Frage ist, wo du die Dinger ablegen willst. Wenn du das byte[] in einer kelondro tabelle ablegst, wird der das wieder finden, weil der beim Auslesen die bytes ja einzeln vergleicht (nach einer binären suche..)
Wenn du das aber in eine Hashtable legst, gehts gar nicht weil das den Hash des Objektes zum Wiederfinden nutzt, und der ist hier identisch mit dem nativen pointer zum byte[]. Ein Ablegen in eine TreeMap geht, aber nur wenn du den TreeMap mit einem byte[]- kompatiblem Komparator initialisierst, beispielsweise der Byte64Order. Würde ich auch empfehlen, statt einer Umwandlung nach String.
Orbiter
 
Beiträge: 5792
Registriert: Di Jun 26, 2007 10:58 pm
Wohnort: Frankfurt am Main

Re: Word.word2hash()

Beitragvon apfelmaennchen » Sa Jun 06, 2009 1:41 pm

DANKE !!

Ich wandle ja nicht freiwillig nach String, sondern, weil ich die Bookmark-Records als Map mit MapView in einem BLOBHeap speicher. Bei diesem Map habe ich mich ja auf String festgelegt, da fast alles an einem Bookmark ein String ist (war), nur eben der Verweis auf ein Topic nicht - war bisher der Pfad-String und ist jetzt ein Hash.

Intern hatte ich bisher mit einer HashMap<byte[], String> gearbeitet (genau hier lag das Problem) - mit der kleinen von Dir empfohlenen Umstellung auf TreeMap<byte[], String>(ByteOrder64) funktioniert alles wie gewünscht :-) - keine weitere Anpassung notwendig!

Also bin ich doch nicht zu blöd....hatte nur den geeigneten Comparator vergessen ;-)

Gruß!
apfelmaennchen
apfelmaennchen
 
Beiträge: 429
Registriert: Mo Aug 20, 2007 7:06 pm


Zurück zu YaCy Coding & Architecture

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste