J'ai besoin de générer des numéros d'identification uniques à la volée en utilisant javascript. Dans le passé, j'ai fait cela en créant un nombre en utilisant le temps. Le nombre serait composé de l'année à quatre chiffres, du mois à deux chiffres, du jour à deux chiffres, des heures à deux chiffres, des minutes à deux chiffres, des secondes à deux chiffres et des millisecondes à trois chiffres. Donc, cela ressemblerait à quelque chose comme ceci: 20111104103912732 ... cela donnerait suffisamment de certitude d'un numéro unique pour mes besoins.
Cela fait un moment que je n'ai pas fait ça et je n'ai plus le code. Quelqu'un a-t-il le code pour le faire ou une meilleure suggestion pour générer un identifiant unique?
javascript
time
numbers
unique
Nick Petrie
la source
la source
new Date().toISOString ()
?Réponses:
Si vous voulez juste un numéro unique, alors
vous donnerait un chiffre simple. Mais si vous avez besoin de la version lisible, vous êtes dans un peu de traitement:
la source
new Date().getTime();
ledate.getUTCMilliseconds()
retourne un nombre entre 0 et 999.date.getTime()
renvoie des millisecondes depuis le 1er janvier 1970. (horodatage normal). w3schools.com/jsref/jsref_obj_date.aspfunction foo1() {console.log(new Date().getUTCMilliseconds()); console.log(new Date().getUTCMilliseconds()); }
The value returned by getUTCMilliseconds() is an integer between 0 and 999.
. C'est la pire idée pour un identifiant unique, le premier paragraphe doit être supprimé.Une meilleure approche serait:
au lieu de
valueOf () est "très probablement" un nombre unique. http://www.w3schools.com/jsref/jsref_valueof_date.asp .
la source
+new Date()
valueOf()
. Je viens d'utiliser ceci -+performance.now().toString().replace('.', 7)
developer.mozilla.org/en-US/docs/Web/API/Performance/nowLe moyen le plus court de créer un nombre dont vous pouvez être sûr qu'il sera unique parmi autant d'instances distinctes que vous pouvez penser est
S'il y a une différence de 1 milliseconde dans l'appel de fonction, il est garanti à 100% de générer un nombre différent . Pour les appels de fonction dans la même milliseconde, vous ne devriez commencer à vous inquiéter que si vous créez plus de quelques millions de nombres dans cette même milliseconde, ce qui n'est pas très probable.
Pour en savoir plus sur la probabilité d'obtenir un nombre répété dans la même milliseconde, voir https://stackoverflow.com/a/28220928/4617597
la source
Cela peut être réalisé simplement avec le code suivant:
la source
Voici ce que je fais quand je veux quelque chose de plus petit qu'un tas de nombres - changer de base.
la source
(Date.now() + Math.random()).toString(36)
pour éviter les conflits en millisecondes. C'est court et génère quelque chose comme "k92g5pux.i36"Cela fonctionne plus rapidement que la création d'une
Date
instance, utilise moins de code et produira toujours un numéro unique (localement):jsfiddle: http://jsfiddle.net/j8aLocan/
J'ai publié ceci sur Bower et npm: https://github.com/stevenvachon/unique-number
Vous pouvez également utiliser quelque chose de plus élaboré tel que cuid , puid ou shortid pour générer un non-nombre.
la source
j'utilise
Donc, si par hasard le code est déclenché en même temps, il y a aussi une petite chance que les nombres aléatoires soient les mêmes.
la source
new Date()
soit utile dur. Vous pourriez obtenir les mêmes numéros avec deux dates différentesMath.random()
?Cela devrait faire:
la source
si vous voulez un numéro unique après quelques millisecondes
Date.now()
, utilisez-le , si vous voulez l'utiliser à l'intérieur d'un,for loop
puis utilisez-leDate.now() and Math.random()
ensemblenuméro unique dans une boucle for
sortie :: tous les nombres sont uniques
15598251485988384 155982514859810330 155982514859860737 155982514859882244 155982514859883316
numéro unique sans
Math.random()
output :: Les nombres sont répétés
1559825328327 1559825328327 1559825328327 1559825328328 1559825328328
la source
Après avoir enquêté en ligne, j'ai trouvé l'objet suivant qui crée un identifiant unique par session:
Cela peut être utile à certaines personnes.
À votre santé
Andrew
la source
Cela devrait également faire:
la source
Dans ES6:
Exemple:
la source
la source
En 2020, vous pouvez utiliser l' API Crypto intégrée au navigateur pour générer des valeurs aléatoires cryptographiquement fortes.
à la fois Uint8Array et Crypto.getRandomValues sont pris en charge sur tous les principaux navigateurs, y compris IE11
la source
En publiant cet extrait de code ici pour ma propre référence future (pas garanti mais satisfaisant "unique" assez):
la source
Cela crée un côté client de clé de 32 caractères unique presque garanti, si vous ne voulez que des nombres, changez la variable "chars".
https://jsfiddle.net/j0evrdf1/1/
la source
utilisez ceci: pour créer un numéro unique en javascript
Ça marche vraiment. :)
la source
Appel 1: UniqueValue ('0')
Appel 2: UniqueValue (UniqueValue ('0')) // sera complexe
Sortie de l' échantillon:
for (var i = 0; i <10; i ++) {console.log (UniqueValue (UniqueValue ( '0')));}
60950116113248802
26780116113248803
53920116113248803
35840116113248803
47430116113248803
41680116113248803
42980116113248804
34750116113248804
20950116113248804
03730116113248804
la source
Étant donné que les millisecondes ne sont pas mises à jour toutes les millisecondes dans le nœud, voici une réponse. Cela génère un numéro de ticket unique lisible par l'homme. Je suis nouveau dans la programmation et nodejs. S'il vous plait corrigez moi si je me trompe.
}
}
la source
Supposons que la solution proposée par @abarber soit une bonne solution car elle utilise
(new Date()).getTime()
donc une fenêtre de millisecondes et somme untick
en cas de collisions dans cet intervalle, nous pourrions envisager d'utiliser intégré comme nous pouvons clairement le voir ici en action:Tout d'abord, nous pouvons voir ici comment il peut y avoir des collisions dans le cadre de la fenêtre 1/1000 en utilisant
(new Date()).getTime()
:Ensuite, nous essayons la solution proposée qui évite les collisions dans la fenêtre 1/1000:
Cela dit, nous pourrions envisager d'utiliser des fonctions comme le nœud
process.nextTick
appelé dans la boucle d'événements en tant que simpletick
et c'est bien expliqué ici . Bien sûr, dans le navigateur, il n'y en a pasprocess.nextTick
, nous devons donc comprendre comment faire cela. Cette mise en œuvre installera unenextTick
fonction dans le navigateur en utilisant le plus des fonctions plus proches qui sont le E / S dans le navigateursetTimeout(fnc,0)
,setImmediate(fnc)
,window.requestAnimationFrame
. Comme suggéré ici, nous pourrions ajouter lewindow.postMessage
, mais je laisse cela au lecteur car il en a également besoinaddEventListener
. J'ai modifié les versions originales des modules pour les simplifier ici:Nous avons donc dans la fenêtre 1/1000:
la source
Peut-être même mieux serait d'utiliser getTime () ou valueOf (), mais de cette façon, il renvoie un nombre unique et compréhensible par l'homme (représentant la date et l'heure):
la source
la source
Facile et obtenez toujours une valeur unique:
la source
J'ai fait de cette façon
la source
la source
en référence à la solution #Marcelo Lazaroni ci-dessus
renvoie un nombre tel que celui-ci 1567507511939.4558 (limité à 4 décimales), et donnera des nombres non uniques (ou des collisions) tous les 0,1%.
l'ajout de toString () corrige ce problème
Date.now() + Math.random().toString()
renvoie '15675096840820.04510962122198503' (une chaîne), et est en outre si 'lent' que vous n'obtenez jamais la 'même' milliseconde, de toute façon.
la source
la source
En utilisant
toString(36)
, légèrement lent, voici la solution la plus rapide et unique:la source
Pour obtenir un numéro unique:
Exemple:
vous pouvez changer la longueur en utilisant:
la source
100% garanti pour générer un nombre différent ...
la source