CyborgBeta
Captain
- Registriert
- Jan. 2021
- Beiträge
- 3.660
Hallo, ich möchte aus 4 Buchstaben (aus a-z) einen 4-stelligen Hashwert der Form 0000 bis 9999 berechnen.
Nun gibt es ja 26^4=456976 Kombinationsmöglichkeiten der 4 Buchstaben, aber nur 10.000 unterschiedliche Ausgabewerte (klar).
Es muss also (und soll auch) Kollisionen geben. Meine Frage wäre, wie ich erreichen könnte, dass zum Beispiel "aaaa" einen komplett anderen Hashwert erzeugt als "baaa" - oder als "abaa" (Pseudozufälligkeit)?
Mein bisheriger Versuch:
Anschließend möchte ich aus der hashCode-Methode dann noch ein Bash-Script (bzw. Funktion) machen.
Habt ihr da Ideen? Mir schwirrt bei int-Werten auch die magische Primzahl 31 im Kopf herum, aber ich weiß nicht, wie ich das umsetzen könnte, und ob das sinnvoll wäre.
Nun gibt es ja 26^4=456976 Kombinationsmöglichkeiten der 4 Buchstaben, aber nur 10.000 unterschiedliche Ausgabewerte (klar).
Es muss also (und soll auch) Kollisionen geben. Meine Frage wäre, wie ich erreichen könnte, dass zum Beispiel "aaaa" einen komplett anderen Hashwert erzeugt als "baaa" - oder als "abaa" (Pseudozufälligkeit)?
Mein bisheriger Versuch:
Java:
public class Names {
public static void main(String[] args) {
System.out.println(hashCode("aaaa"));
System.out.println(hashCode("zzzz"));
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
String s1 = (char) ('a' + i) + "" + (char) ('a' + j);
String s2 = (char) ('z' - i) + "" + (char) ('z' - j);
System.out.println(s1 + " " + s2 + " " + hashCode(s1) + " " + hashCode(s2));
}
}
}
public static String hashCode(String s) {
if (s.length() < 4) {
s += "a".repeat(4 - s.length());
}
int hash = 0;
int multiplier = 1;
for (int i = 0; i < 4; i++) {
hash += multiplier * (s.charAt(i) - 'a');
multiplier *= 26;
}
return String.format("%04d", (int) (10000.0 / Math.pow(26, 4) * hash));
}
}
Anschließend möchte ich aus der hashCode-Methode dann noch ein Bash-Script (bzw. Funktion) machen.
Habt ihr da Ideen? Mir schwirrt bei int-Werten auch die magische Primzahl 31 im Kopf herum, aber ich weiß nicht, wie ich das umsetzen könnte, und ob das sinnvoll wäre.