Java: ID unique à 10 chiffres
J'ai besoin de générer un unique à 10 chiffres de l'ID en Java. Ce sont les restrictions pour cet ID:
- Numériques Seulement
- Un Maximum de 10 chiffres
- Possible de créer jusqu'à 10 différents IDs par seconde
- Doit être unique (même si l'application re-commence)
- Pas possible d'enregistrer un numéro dans la Base de données
- Aussi rapide que possible de ne PAS ajouter trop de lattency pour le système
La meilleure solution que j'ai trouvé jusqu'à présent est la suivante:
private static int inc = 0;
private static long getId(){
long id = Long.parseLong(String.valueOf(System.currentTimeMillis())
.substring(1,10)
.concat(String.valueOf(inc)));
inc = (inc+1)%10;
return id;
}
Cette solution présente les inconvénients suivants:
- Si pour une raison quelconque, il est nécessaire de créer plus de 10 Id par seccond, cette solution ne fonctionne pas.
- À environ 32 ans, cet ID peut être répétée (Ce qui est probablement acceptable)
Toute autre solution pour créer cette ID?
Tout autre problème, je n'ai pas pensé à la mienne?
Merci pour votre aide,
source d'informationauteur magodiez
Vous devez vous connecter pour publier un commentaire.
C'est une petite amélioration pour le vôtre, mais doit être résilient.
Comme il est, il doit gérer jusqu'à 1000 par seconde avec un relativement court, la vitesse du cycle. Afin de prolonger le cycle de taux (mais raccourcir la résolution) vous pouvez utiliser
(System.currentTimeMillis() /10) % 10000000000L
ou(System.currentTimeMillis() /100) % 10000000000L
.Cela peut être une idée folle, mais c'est une idée :).
java.util.UUID.randomUUID().toString()
Deuxième convertir généré chaîne de tableau d'octets (
byte[]
)Puis de le convertir en longue mémoire tampon:
java.nio.ByteBuffer.wrap( byte
digest[] ).asLongBuffer().get()
Tronquée à 10 chiffres
Pas sûr que sur l'originalité de cette approche tho, je sais que vous pouvez compter sur l'unicité de l'Uuid, mais vous n'avez pas vérifié la façon unique sont-ils convertis et tronquée à 10 chiffres du numéro.
Exemple est tiré de JavaRanchpeut-être qu'il n'y est plus.
Edit: Que vous êtes limité à 10 chiffres peut-être aléatoire simple générateur devrait être assez pour vous, jetez un oeil dans cette quesion/réponses sur DONC: Java: au hasard le numéro de long en 0 <= x < n gamme
Ce qui signifie qu'il doit être unique? Même au travers de plus actuellement les instances en cours d'exécution? Il casser votre mise en œuvre.
Si elle doit être unique dans l'univers, la meilleure solution est d'utiliser l'UUID tant que c'est mathématiquement prouvé identificateur générateur car il génère de la valeur unique de chaque univers. Moins le nombre exact vous apporte les collisions.
Lorsqu'il n'existe qu'une seule instance simultanée, vous pouvez prendre le temps actuel dans millis et de résoudre les 10ms problème à l'aide d'incrémentation. Si vous sacrifier bon nombre de positions dans le numéro, vous pouvez obtenir le plus grand nombre dans un délai d'un millisecondes. Je voudrais que de définir la précision, je veux dire combien de numéros uniques avez-vous besoin par secondes. Vous permettra de résoudre le problème sans la persistance à l'aide de cette approche.
private static AtomicReference currentTime = new AtomicReference<>(le Système.currentTimeMillis());