Frage

Zusammenfassung. Ich bin eine persistente Java-Web-Anwendung zu entwickeln, und ich brauche, um sicherzustellen, dass alle Ressourcen, die ich bestehen global eindeutige Kennungen haben Duplikate zu verhindern

Das Kleingedruckte:

  1. Ich bin ein RDBMS nicht verwenden, so habe ich keine Lust Generatoren (wie die, die von Oracle)
  2. Ich mag es schnell sein, vorzugsweise alle im Speicher - ich habe lieber eine Datei nicht öffnen und einen Wert erhöhen
  3. Es muss Thread-sicher sein (ich davon aus, dass nur eine JVM zu einer Zeit benötigen IDs erzeugen)
  4. braucht Es Konsistenz über Instantiierungen des JVM zu sein. Wenn der Server heruntergefahren und startet, sollte der ID-Generator nicht erneut erzeugen die gleichen IDs in früheren instantiations erzeugt (oder zumindest die Chance, wirklich sein, wirklich schlank - ich viele Millionen presisted Ressourcen antizipieren)
  5. Ich habe die Beispiele in den EJB eindeutigen ID Muster Artikeln gesehen. Sie werden bei mir nicht funktionieren (ich würde lieber nicht allein auf System.currentTimeMillis () verlassen, weil wir pro Millisekunde mehr Ressourcen persistierenden würden).
  6. Ich habe in den Antworten vorgeschlagen in diese Frage . Meine Sorge über sie ist, was ist die Chance, dass ich eine doppelte ID im Laufe der Zeit erhalten wird? Ich bin von dem Vorschlag fasziniert Java zu verwenden .util.UUID einem für UUID , aber auch hier sind die Chancen eines Duplikats müssen verschwindend klein sein.
  7. Ich verwende JDK6
War es hilfreich?

Lösung

Ziemlich sicher, dass UUIDs ist „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 zu relativieren, ein jährliches Risiko, von einem Meteoriten getroffen zu werden schätzungsweise in 17 Milliarden eine Chance zu sein, bedeutet, dass die Wahrscheinlichkeit, über ,00000000006 (6 × 10-11), das entspricht die Quote von ein paar zig Billionen von UUIDs in einem Jahr und mit einem Duplikat. mit anderen Worten, erst nach Erzeugung von 1 Milliarde UUIDs jede Sekunde für die nächsten 100 Jahre zu schaffen, würde die Wahrscheinlichkeit nur ein Duplikat der Schaffung etwa 50% betragen. die Wahrscheinlichkeit, ein Duplikat würde etwa 50%, wenn jeder Mensch auf der Erde 600 Millionen UUIDs besitzt "

http://en.wikipedia.org/wiki/Universally_Unique_Identifier

Andere Tipps

public class UniqueID {
    private static long startTime = System.currentTimeMillis();
    private static long id;

    public static synchronized String getUniqueID() {
        return "id." + startTime + "." + id++;
    }
}

Wenn es braucht pro PC eindeutig sein. Sie wahrscheinlich (System.currentTimeMillis() << 4) | (staticCounter++ & 15) oder etwas ähnliches verwenden könnten

Das würde erlauben Sie 16 pro ms zu erzeugen. Wenn Sie mehr benötigen, verschieben sich um 5 und und mit 31 ...

, wenn es braucht über mehrere PCs, einzigartig zu sein, sollten Sie auch in Ihrem primären Netzwerkkarte der MAC-Adresse verbinden.

edit: klären

private static int staticCounter=0;
private final int nBits=4;
public long getUnique() {
    return (currentTimeMillis() << nBits) | (staticCounter++ & 2^nBits-1);
}

und nBits zur Quadratwurzel der größten Zahl ändern, sollten Sie benötigen pro ms zu erzeugen.

Es wird schließlich rollen. Wahrscheinlich 20 Jahre oder etwas mit nBits bei 4.

Aus dem Gedächtnis der RMI Remote-Pakete enthalten einen UUID-Generator. Ich weiß nicht, ob das ist diskussionswürdig.

Als ich sie hatte zu generieren wir verwenden in der Regel einen MD5 Hashsummen der aktuellen Datum Zeit, die Benutzername und die IP-Adresse des Computers. Im Grunde ist die Idee, alles zu nehmen, die Sie über den Computer / Person herausfinden können, und dann einen MD5-Hash dieser Informationen erzeugen.

Es funktioniert wirklich gut und ist unglaublich schnell (wenn man die Message zum ersten Mal initialisiert hat).

warum nicht so tun

String id = Long.toString(System.currentTimeMillis()) + 
    (new Random()).nextInt(1000) + 
    (new Random()).nextInt(1000);

Wenn Sie eine kürzere und schnellere Implementierung verwenden, die Java-UUID einen Blick auf:

https://code.google.com/p/spf4j/source/browse/trunk/spf4j-core/src/main/java/org/spf4j/concurrent/UIDGenerator.java

siehe die Implementierung Entscheidungen und Einschränkungen in der javadoc.

Hier ist ein Unit-Test, wie man verwenden:

https://code.google.com/p/spf4j/source/browse/trunk/spf4j-core/src/test/java/org/spf4j/concurrent/UIDGeneratorTest.java

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top