Die Erzeugung einer Global eindeutigen Bezeichner in Java
Zusammenfassung: ich bin die Entwicklung einer persistenten Java-web-Anwendung, und ich muss sicherstellen, dass alle Ressourcen, die ich beibehalten habe, globally unique identifiers um doppelte Einträge zu vermeiden.
Das Kleingedruckte:
- Ich bin nicht mit einem RDBMS, so habe ich keine Lust-Sequenz-Generatoren (wie Sie etwa von Oracle)
- Ich möchte es schnell sein, möglichst alle im Memory - Speicher, die ich lieber nicht haben, um eine Datei öffnen und die Schrittweite einen Wert
- Es braucht, um thread-sicher (ich gehe davon aus, dass nur eine JVM in einer Zeit, in der Notwendigkeit zu erzeugen, IDs)
- Es muss die Konsistenz zwischen Instanzen der JVM. Wenn der server heruntergefahren und startet, wird die ID-generator sollte nicht re-generieren, die die gleichen IDs generiert, die in früheren Instanzen (oder zumindest die chance hat, zu sein wirklich, wirklich schlank - ich erwarte viele Millionen presisted Ressourcen)
- Die ich gesehen habe, die Beispiele in der EJB-unique-ID-Muster-Artikel. Sie arbeiten nicht für mich (ich möchte lieber nicht allein auf System.currentTimeMillis (), da werden wir beibehalten von mehreren Ressourcen pro Millisekunde).
- Ich habe mir die Antworten vorgeschlagen, in diese Frage. Meine Sorge um Sie ist, was ist die chance, dass ich bekommen eine doppelte ID im Laufe der Zeit? Ich bin fasziniert von dem Vorschlag, java.util.UUID für eine UUID, aber wieder die Chancen auf eine doppelte sein müssen, verschwindend klein.
- Ich bin mit JDK6
Führen Sie mehrere Instanzen der Anwendung auf verschiedenen Rechnern? Wenn Sie sind, sind Sie wahrscheinlich starten Maschinen in Chargen-so dass es wahrscheinlich, dass mehrere Prozesse starten in der gleichen Millisekunde? Wenn ein Angreifer einen Weg findet, um zu einer UUID Kollision, gefährden die Sicherheit Ihrer Anwendung?
(A) welches Volumen von IDs generiert werden? Wie schnell? (Wie viele pro Sekunde/minute) (B) ja, UUIDs erfunden wurden, genau für Ihren Zweck.
(A) welches Volumen von IDs generiert werden? Wie schnell? (Wie viele pro Sekunde/minute) (B) ja, UUIDs erfunden wurden, genau für Ihren Zweck.
InformationsquelleAutor Julie | 2008-10-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ziemlich sicher, dass UUIDs sind "gut genug". Es gibt 340,282,366,920,938,463,463,374,607,431,770,000,000 UUIDs zur Verfügung.
http://www.wilybeagle.com/guid_store/guid_explain.htm
"Um diese zahlen in Perspektive, eine jährliche Risiko, von einem Meteoriten getroffen wird geschätzt, dass eine chance von 17 Milliarden, das heißt, die Wahrscheinlichkeit ist etwa 0.00000000006 (6 × 10-11), entspricht die Verschiedenheit der Schaffung von ein paar Dutzend Billionen von UUIDs in einem Jahr und mit einer doppelten. In anderen Worten, nur nach dem generieren 1 Milliarde UUIDs jede Sekunde für die nächsten 100 Jahre, ist die Wahrscheinlichkeit, nur eine doppelte wäre etwa 50%. Die Wahrscheinlichkeit, eine doppelte wäre etwa 50%, wenn jeder Mensch auf der Erde besitzt 600 Millionen UUIDs"
http://en.wikipedia.org/wiki/Universally_Unique_Identifier
ja, verschwindend
Gut, nur weil es so viele mögliche Werte, bedeutet nicht unbedingt, dass Sie schrieb den Algorithmus gut genug, um eine gute zufällige Verteilung. Dann wieder die Designer der UUID-Klasse haben wahrscheinlich viel mehr Gedanken in ihm, als ich es könnte an einem Nachmittag!
yep, ganz ein bisschen Gedanken darüber gemacht... "Standardisiert von der Open Software Foundation (OSF) als Teil des Distributed Computing Environment (DCE)"
Während Sie in der Nacht sich Gedanken über das doppelte UUID, werden Sie sicher zu halten ein Auge offen für diese Meteoriten... 😉
InformationsquelleAutor Shawn Miller
Nicht Rollen Sie Ihre eigenen UUID-code. Es gibt viele subtile Wege, um bekommen es falsch. Dieser code wird schlechte Dinge tun, wenn mehrere Prozesse starten in der gleichen Millisekunde, wie beim starten einer charge von Maschinen, die die gleiche Aufgabe zur gleichen Zeit.
InformationsquelleAutor Dave Griffiths
Wenn es sein muss einmalig pro PC: könnten Sie wahrscheinlich verwenden
(System.currentTimeMillis() << 4) | (staticCounter++ & 15)
oder sowas.Erlauben würde, dass Sie zum generieren von 16 ms pro. Wenn Sie mehr benötigen, Verschiebung von 5 und und es mit 31...
wenn es muss eindeutig sein, zwischen mehreren PCs, sollte man auch kombinieren, in der primären Netzwerkkarte die MAC-Adresse.
edit: um zu klären,
und ändern nBits der Wurzel der größten Zahl, die Sie benötigen, zu erzeugen pro ms.
Wird es schließlich überschlagen. Wahrscheinlich 20 Jahre oder etwas mit nBits am 4.
Meine Firma verwendet ein system sehr ähnlich zu dem, das für die Erzeugung unserer "UUIDs". Es funktioniert ok (ich habe noch nie eine doppelt). Es scheint wirklich hacky obwohl, und auch ermöglicht es Ihnen, um herauszufinden, wo und Wann was erstellt wurde.
Es ist hacky-in, war ich beschränke mich auf eine lange. Wenn Sie einfach zwei longs und angehängt eine Zählung im currentTime in eine synchronisierte Methode, wird es nicht scheitern, es sei denn, deine Uhr-änderungen. Wenn Sie sind besorgt, dass es wäre trivial zu beheben zu können.
InformationsquelleAutor Bill K
Aus dem Gedächtnis der RMI-remote-Pakete enthalten eine UUID-generator. Ich weiß nicht, ob das ist, lohnt ein Blick in.
Wenn ich habe, diese zu generieren, die ich verwenden in der Regel eine MD5-hashsumme der aktuellen Datum /Uhrzeit, den Benutzernamen und die IP-Adresse des Computers. Prinzipiell ist die Idee, alles zu nehmen, Sie können sich über die computer - /person und erzeugen dann einen MD5-hash dieser Informationen.
Es funktioniert wirklich gut und ist unglaublich schnell (sobald Sie initialisiert die MessageDigest für die erste Zeit).
InformationsquelleAutor Aidos
warum nicht tun Sie dies
InformationsquelleAutor kem
wenn Sie möchten, verwenden Sie eine kürzere und schnellere Implementierung, java-UUID werfen Sie einen Blick auf:
https://code.google.com/p/spf4j/source/browse/trunk/spf4j-core/src/main/java/org/spf4j/concurrent/UIDGenerator.java
sehen die Umsetzung Möglichkeiten und Grenzen in der javadoc.
hier ist ein unit-test auf wie zu verwenden:
https://code.google.com/p/spf4j/source/browse/trunk/spf4j-core/src/test/java/org/spf4j/concurrent/UIDGeneratorTest.java
InformationsquelleAutor user2179737