2017-03-16 5 views
-1

Da es bekannt ist, dass Java rund 4 Milliarden eindeutige Hashcodes generiert.Größeren HashCode generieren JAVA

I Hashcode einiger String (Beispiel Fname + Lname + DOB + DATE) bin mit der Primary Key meiner Datenbank

in @PrePersist wird gesetzt ich es mit Hashcode, die mich für neue Benutzer Hashcode bei der Generierung hilft. (Was einmalig sein muss).

Jetzt habe ich keine Codes mehr. Eine mögliche Alternative für mich ist die Verwendung von SHA-2, MD5 usw.

Wie kann ich die Größe des Hash-Codes & erhöhen, aber vermeiden, dass große Kollisionen.

+1

Könnten Sie nicht einfach eine Methode definieren, die ähnlich wie hashCode() 'mit einem' long' oder 'BigInteger' Rückgabetyp funktioniert? – Logan

+1

Verwenden Sie den Hash-Code nicht als Primärschlüssel in der Datenbank. Hash-Codes sind nicht eindeutig und eignen sich nicht als eindeutiger Bezeichner. Die Verwendung eines anderen Hash-Algorithmus hilft nicht, da diese Hashes im Prinzip auch nicht eindeutig sind (obwohl in der Praxis Hash-Kollisionen selten sein sollten). Die Verwendung des Hash-Codes als Primärschlüssel ist ein grundlegender Fehler beim Entwurf Ihres Systems. – Jesper

+0

Was passiert, wenn zwei Benutzer denselben Vor- und Nachnamen und dasselbe Geburtsdatum haben, die sich am selben Tag registrieren? Ich weiß, dass dieses Szenario wahrscheinlich selten ist, aber was passiert, wenn es passiert? – dstarh

Antwort

2

Wenn Ihr Ziel ist, eine eindeutige Kennung für die Datenbank zu erstellen, würde ich vorschlagen, UUID zu verwenden.

UUID Version 3, da es einen Namespace verwendet, wird Ihr Fall passen.

Einige Datenbanken haben native Unterstützung für UUID, zum Beispiel PostgreSQL

+0

Hashcode in meinem Fall ist Zusammensetzung der Felder, die dieses Tupel eindeutig macht, die dann mein Primärschlüssel wird. Für meinen Fall verhält es sich wie Prüfsumme + Eindeutigkeit & Primärschlüssel. – Ashish

+2

@Ashish, das ist _still_ eine schreckliche Idee. Hash-Codes sollten niemals als einzigartig betrachtet werden. _Stoppen Sie die Verwendung von Hash-Codes als Primärschlüssel._ –

1

Ich glaube, Sie sind verwirrt über int Object.hashCode() verwenden, die Sie überschreiben können, und die einen int zurückgibt und einen sicheren Hash-Funktion. Das sind zwei Dinge. Object.hashCode soll keine eindeutigen ganzen Zahlen zurückgeben (1 ist eine gültige Implementierung). Daher ist die Verwendung von String.hashCode() für die Objektidentität keine gute Idee, da Kollisionen auftreten können und werden. Es ist zur Verwendung mit z.B. HashTables; Das heißt, es ist für die Leistung optimiert und nicht zur Vermeidung von Kollisionen.

Sie können tatsächlich sha1, sha2, sha3 oder md5 verwenden, wenn Sie eine Art Inhaltshash wünschen. Wenn nicht, verwenden Sie SecureRandom oder UUID, um etwas Zufälliges zu generieren. All diese haben eine sehr geringe Wahrscheinlichkeit, dass Sie jemals eine Kollision bekommen (natürlich nicht vollständig 0).

Verwandte Themen