2012-10-28 10 views
5

Sto lavorando a un programma basato su hash. La mia domanda è la HashCode di una stringa rimarrà la stessa per l'intera applicazione.L'hashcode di una stringa sarà lo stesso per l'intera applicazione?

Il motivo mi è stato chiesto questo perché, il KetamaMemcachedSessionLocator all'interno Mecached Server funziona in questo modo Se ci sono due server su cui è in esecuzione Memcache, voglio individuare una chiave da un server particolare.

String key = "MyString"; 
int keyid = key.hashCode(); 
int v = keyid % 1; //(I assume that this will contact the First Server to retrieve that value) 
int v = keyid % 2; //(I assume that this will contact the Second Server to retrieve that value) 
String value = MemcachedClient.get(key, v); 

Seguito alla realizzazione degli scenari basati su questo sito

http://dev.mysql.com/doc/refman/5.0/en/ha-memcached-using-hashtypes.html

si prega di condividere le vostre opinioni, in caso se trovate eventuali problemi se il modo sopra di esso funziona.

risposta

10

Secondo contratto hashcode lo farà sempre la stessa cosa se string1.eqauls(string2)

The java.lang.String hash function

Nel tentativo di fornire una rapida implementazione, le prime versioni della classe Java stringa fornita a) attuazione hashCode (che considerava al massimo 16 caratteri scelti dalla stringa. Per alcuni dati comuni questo ha funzionato molto male, fornendo risultati in cluster inaccettabili e conseguentemente prestazioni di hashtable lente.

Da Java 1.2, la classe java.lang.String implementa il suo hashCode() utilizzando un algoritmo sum del prodotto sull'intero testo della stringa. Dato un'istanza s della classe java.lang.String, per esempio, avrebbe un codice hash h (s) definita da

 h(s)=\sum_{i=0}^{n-1}s[i] \cdot 31^{n-1-i}

cui termini sono sommati mediante addizione int Java 32 bit, s [ i] denota il carattere ith della stringa, e n è la lunghezza di s.

Come con qualsiasi funzione di hashing generale, sono possibili le collisioni. Ad esempio, le stringhe "FB" ed "Ea" hanno lo stesso valore di hash. L'implementazione hashCode() di String utilizza il numero primo 31 e la differenza tra 'a' e 'B' è solo 31, quindi il calcolo è 70 × 31 + 66 = 69 × 31 + 97.

Controllare Collections Framework Enhancements in Java SE 7 come vedi che ci sono dei cambiamenti e chi lo sa sarà.

La funzione di hash alternativa viene applicata solo ai tasti di tipo String.

+0

Le collisioni non sono un problema qui, e sto usando Java 1.6, non c'è modo per qualche anno che cambieremo la versione di Java, quindi andrò con questo approccio. Grazie . – Pawan

1

Sì e no.

Il contratto hashCode() specifica che due stringhe uguali avranno lo stesso codice hash all'interno della stessa JVM. Ciò significa che il codice sostituirà non finché la stringa non cambia.

D'altra parte, l'effettiva attuazione hashCode()è cambiato da una versione JVM all'altro e/o da un fornitore JVM all'altro. Ad esempio, Oracle Java 7u6 provides a faster alternative hashing function per stringhe superiori a una determinata dimensione. Attualmente è usato solo all'interno del framework Collections, ma potrebbe benissimo diventare un default a livello di sistema con Java 8.

Fondamentalmente, è possibile fare affidamento su hashCode() consistente all'interno della stessa applicazione, ma non tra diverse istanze dell'applicazione. Se intendi memorizzare o condividere codici hash, dovresti probabilmente implementare le tue funzioni.

Un altro potenziale punto di interesse è che hashCode() come definito in Java è un int, cioè lungo 32 bit. Questo non è affatto un identificatore univoco: le collisioni sono abbastanza frequenti e il programmatore dovrebbe gestirle. Se il tuo sistema di archiviazione dipende da chiavi univoche, potresti voler usare comunque una funzione di hashing più forte, come ad esempio SHA-2.

Problemi correlati