Wie generieren Sie eindeutige positive 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.
- Warum sind Sie nicht Folge? Sind Sie in der Lage, Dinge wie das? Oder UUID ist dies eine Lösung, die Sie haben zu verwenden?
- können Sie erklären, mehr über die Reihenfolge
- Welche DB verwendest du? Was db-framework Sie verwenden(JDBC, Hibernate, myBatis)?
- Bitte Lesen Sie über PostgreSQL sequence neilconway.org/docs/sequences. Dies ist nur ein Beispiel. In Ihrer Datenbank sollten Sie fein etwas ähnlich.
- Ich bin mit mysql. Ich will es tun, in der Anwendung die Seite, weil, wenn ich es in der Datenbank Seite feuere ich eine weitere Abfrage erneut, um die id der Zeile..und ich möchte vermeiden, dass
- Warum denkst du, MostSignificantBits der UUID wird einzigartig sein? Die UUID ist einzigartig, aber nicht unbedingt die MostSignificantBits der UUID.
- ja u sind Recht user93353 . ich habe gerade überprüft die java-docs auf der UUID.
- Dieses Szenario wird mehr überzeugend, wenn Ihre Anwendung ist Datenbank-agnostisch und Sie haben für die Verwaltung Ihrer eigenen Reihenfolge. Halten Sie den primären Schlüssel als einen uuid-string mit Abstand möglicherweise nicht so effizient im Vergleich zu einer Anzahl
- Die meisten Datenbanken, die ich benutzt habe(einschließlich MySQL) werden Sie wieder die ID, die generiert wurde, für das neu eingefügte Element auf die insert-Methode, dh: die insert-Methode gibt eine lange, die die ID des Elements, das eingefügt wurde, ebenso, wenn Sie legen Sie eine Liste der Elemente, die es gibt eine Liste von longs mit passenden Indizes der Liste eingefügt wurde
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)
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.
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.
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.