Wie generieren Sie einzigartige Lange mit der UUID
Habe ich eine Anforderung zum generieren eindeutiger Langen ids für meine Datenbank primary key-Spalte.
Ich dachte, dass ich verwenden können, UUID.randomUUID().getMostSignificantBits() aber manchmal generieren einige negative lange auch das ist ein problem für mich.
Ist es möglich, erzeugen nur positive langen von der UUID ?Es werden wie Milliarden Einträge, so ich will, dass jeder generierte Schlüssel muss eindeutig sein.
InformationsquelleAutor der Frage Saurabh Kumar | 2013-03-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfen Sie einen Blick auf http://commons.apache.org/sandbox/commons-id//index.html
Es hat eine LongGenerator, die können Ihnen genau das, was Sie brauchen.
Zusätzlich, wenn Sie mit Hibernate, dann können Sie bitten, es zu erzeugen der IDs für Sie (es hat mehrere algorithmen, die Sie wählen können), wenn nicht, können Sie nehmen Sie nur einen Blick auf Ihre Umsetzung beispielsweise http://grepcode.com/file/repo1.maven.org/maven2/hibernate/hibernate/2.1.8/net/sf/hibernate/id/TableHiLoGenerator.java#TableHiLoGenerator)
InformationsquelleAutor der Antwort Doron Manor
Der Grund, warum dies funktioniert, ist, wenn Sie bitweise & mit 1 es ermöglicht, die gleiche Stelle zu gehen, wie es ist und wenn Sie das tun bitweise & mit 0, es blockiert es und das Ergebnis ist 0. Nun, Lange.MAX_Value in Binär ist
ist diese 0, gefolgt von 63 1s (insgesamt 64 bits, lang ist ' s in java)
So, wenn Sie bitweise & eine Zahl X mit dieser oben genannten Nummer, dann erhalten Sie die gleiche Anzahl X der Ausnahme, dass das bit ganz Links ist jetzt verwandelte sich in eine null. Das heißt, Sie haben sich nur geändert das Zeichen, dass die Anzahl und nicht der Wert.
InformationsquelleAutor der Antwort Sasha Pechenyi
Wie die anderen geschrieben haben, lange nicht genug Raum für eine eindeutige Nummer. Aber in vielen Fällen eine Anzahl kann eindeutig genug für eine bestimmte Verwendung.
Zum Beispiel, Zeitstempel mit Nanosekunden-Präzision ist oft gut genug.
Um es zu bekommen, wechseln Sie die aktuelle Millisekunden 20 bits an Speicherplatz für Nanosekunden und dann durch überlagerung mit den Nanosekunden:
Den nano & ~9223372036854251520L Teil nimmt die aktuelle Nanosekunden und legt das erste 44 bytes auf 0, so dass nur die rechten 20 bit darstellen Nanosekunden bis zu einer Millisekunde (999999 nanos)
Es ist das gleiche wie:
Anmerkung: Nanosekunden sollte nicht verwendet werden, zur Darstellung der aktuellen Zeit, weil Ihr Startpunkt nicht in der Zeit behoben, und weil Sie recycelt werden, wenn Sie die maximale Reichweite.
Können Sie einen beliebigen anderen bit-manipulation. Es ist in der Regel gut berücksichtigt werden die aktuelle Zeit und etwas anderes, wie die aktuelle thread-id, Prozess-id, ip.
InformationsquelleAutor der Antwort Daniel Nuriyev
Ich kam gerade über diese Lösung. Ich bin zur Zeit versuchen zu verstehen, die Lösung.Es sagt, dass die Java-Implementierung der twitter-Schneeflocke. 64-bit-sequenzielle ID-generator basierend auf twitter-Schneeflocke ID-generation-Algorithmus.
https://github.com/Predictor/javasnowflake
Anregungen sind willkommen.
InformationsquelleAutor der Antwort Saurabh Kumar