Génération d'un identifiant global unique en Java
Résumé: je suis l'élaboration d'une persistante d'applications web Java, et j'ai besoin de faire en sorte que toutes les ressources je persiste possède un identificateur unique pour éviter les doublons.
L'Amende Impression:
- Je ne suis pas à l'aide d'un SGBDR, donc je n'ai pas toute la fantaisie de la séquence de générateurs (tel que celui fourni par Oracle)
- J'aimerais qu'il soit rapide, de préférence dans la mémoire - je préfère ne pas avoir à ouvrir un fichier et l'incrément de la valeur
- Il doit être thread-safe (j'attends qu'une seule JVM au moment aurez besoin pour générer des Id)
- Il doit y avoir cohérence entre les instanciations de la JVM. Si le serveur s'arrête et démarre, l'ID du générateur ne doit pas re-générer le même Id qu'elle a généré dans les précédents instanciations (ou au moins la chance doit être vraiment, vraiment slim - je anticiper de nombreux, des millions de presisted ressources)
- J'ai vu des exemples dans les EJB ID unique modèle de l'article. Ils ne fonctionnent pas pour moi (je préfère ne pas compter uniquement sur le Système.currentTimeMillis() parce que nous allons la persistance de plusieurs ressources par ordre de la milliseconde).
- J'ai regardé les réponses proposées dans cette question. Mon inquiétude à son sujet, quelle est la chance que je vais obtenir un ID en double fil du temps? Je suis intrigué par la suggestion d'utiliser java.util.UUID pour un UUIDmais encore une fois, les chances d'un duplicata doivent être infime.
- Je suis en utilisant le JDK6
source d'informationauteur Julie
Vous devez vous connecter pour publier un commentaire.
Assez sûr Uuid sont "assez bon". Il y a 340,282,366,920,938,463,463,374,607,431,770,000,000 Uuid disponibles.
http://www.wilybeagle.com/guid_store/guid_explain.htm
"Pour mettre ces chiffres en perspective, un annuel de risque d'être frappé par une météorite est estimée à une chance sur 17 milliards de dollars, cela signifie que la probabilité est d'environ 0.00000000006 (6 × 10-11), équivalent à la cote de la création de quelques dizaines de milliers de milliards de Uuid dans une année et d'avoir un doublon. En d'autres termes, seulement après avoir généré 1 milliard de dollars Uuid de chaque seconde pour les 100 prochaines années, la probabilité de créer juste un doublon serait d'environ 50%. La probabilité d'un doublon serait d'environ 50% si chaque personne sur terre est propriétaire de 600 millions d'Uuid"
http://en.wikipedia.org/wiki/Universally_Unique_Identifier
Si elle doit être unique par PC: vous pourriez probablement utiliser
(System.currentTimeMillis() << 4) | (staticCounter++ & 15)
ou quelque chose comme ça.Qui vous permettra de générer 16 par mme. Si vous avez besoin de plus, le décalage de 5 et et de avec 31...
si elle doit être unique au sein de plusieurs Ordinateurs, vous devez également se combiner dans votre réseau principal adresse MAC de la carte.
edit: pour clarifier
et changement nBits à la racine carré du plus grand nombre vous avez besoin de générer par ms.
Il finira par rouler sur. Probablement 20 ans ou quelque chose avec nBits à 4.
À partir de la mémoire du RMI à distance paquets contiennent un générateur d'UUID. Je ne sais pas si c'est intéressant de regarder dans.
Lorsque j'ai eu à les créer je l'utilise généralement un MD5 hashsum de la date actuelle heure, le nom d'utilisateur et l'adresse IP de l'ordinateur. L'idée de base est de prendre tout ce que vous pouvez trouver sur l'ordinateur/personne et de générer un hash MD5 de cette information.
Il fonctionne vraiment bien et est incroyablement rapide (une fois que vous avez initialisé la MessageDigest pour la première fois).
pourquoi ne pas faire comme ce
si vous souhaitez utiliser une plus courte et la mise en œuvre rapide que java UUID de prendre un coup d'oeil à:
https://code.google.com/p/spf4j/source/browse/trunk/spf4j-core/src/main/java/org/spf4j/concurrent/UIDGenerator.java
voir la mise en œuvre des choix et des limitations dans la javadoc.
ici est un test unitaire sur la façon d'utiliser:
https://code.google.com/p/spf4j/source/browse/trunk/spf4j-core/src/test/java/org/spf4j/concurrent/UIDGeneratorTest.java