2016-06-20 6 views
0

Gibt es eine Möglichkeit, den Min/Max-Hash-Code für eine Zeichenfolge einer bestimmten Länge mit Javas .hashCode() Methode zu berechnen?Min/Max-HashCode-Werte für einen String mit einer bestimmten Länge finden

Vom docs, der verwendete Algorithmus ist:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 

... und es gibt eine int, die positiv oder negativ sein kann.

Da es alle Zeichen fügt den Hash zu berechnen, ich habe versucht, durch die Min-/Max-Hash zu finden .hashCode() auf Saiten von gleicher Länge aus der Min-/Max-Zeichenwerte läuft (space = 32, ~ = 126), aber ich bekomme Werte für s, die außerhalb des Bereichs für meine Min/Max-Hashes sind.

int s =  "hello world".hashCode(); // 1794106052 

// strings the same len as "s" 
int minHash = "   ".hashCode(); // 2142006304 
int maxHash = "~~~~~~~~~~~".hashCode(); // -2034832962 

// hash for s i 

Antwort

1

Wenn die String-Länge ist mindestens 6, dann ist die geringstmögliche HashCode ist Integer.MIN_VALUE und die maximale HashCode Integer.MAX_VALUE ist.

Das heißt, es gibt eine Zeichenfolge der Länge 6, die einen Hash-Code Integer.MIN_VALUE hat, und eine Zeichenfolge der Länge 6, die einen Hash-Code Integer.MAX_VALUE hat.

Sie sehen einen Integer-Überlauf, der wie vorgesehen für hashCode funktioniert.

+0

Aha! Das macht sehr viel Sinn (ich dachte, es wäre überfüllt, ich konnte einfach nicht herausfinden, wo.) Kannst du mir sagen, warum das bei 6 Zeichen passiert und nicht etwa bei 5 oder 7? – JeffThompson

+1

Das erste n wobei 126 * 31^(n-1)> Integer.MAX_VALUE ist 6. –

+0

Gotcha. Und wie würde ich den Min/Max-Hash für Strings mit weniger als 6 Zeichen berechnen? – JeffThompson