Voir Réponse de @Mohamed pour une solution toute faite (le shortid
paquet ). Préférez cette solution à toutes celles proposées sur cette page si vous n'avez pas d'exigences particulières.
Une séquence alphanumérique de 6 caractères est suffisante pour indexer de manière aléatoire une collection de 10 000 pièces (36 6 \= 2,2 milliards et 36 3 \= 46656).
function generateUID() {
// I generate the UID from two parts here
// to ensure the random number provide enough bits.
var firstPart = (Math.random() * 46656) | 0;
var secondPart = (Math.random() * 46656) | 0;
firstPart = ("000" + firstPart.toString(36)).slice(-3);
secondPart = ("000" + secondPart.toString(36)).slice(-3);
return firstPart + secondPart;
}
Les UIDs générés aléatoirement auront une collision après avoir généré ~ √N nombres (paradoxe de l'anniversaire), donc 6 chiffres sont nécessaires pour une génération sûre sans vérification (l'ancienne version ne génère que 4 chiffres qui auraient une collision après 1300 IDs si vous ne vérifiez pas).
Si vous effectuez un contrôle des collisions, le nombre de chiffres peut être réduit de 3 ou 4, mais notez que les performances diminuent de façon linéaire lorsque vous générez de plus en plus d'UID.
var _generatedUIDs = {};
function generateUIDWithCollisionChecking() {
while (true) {
var uid = ("0000" + ((Math.random() * Math.pow(36, 4)) | 0).toString(36)).slice(-4);
if (!_generatedUIDs.hasOwnProperty(uid)) {
_generatedUIDs[uid] = true;
return uid;
}
}
}
Envisagez d'utiliser un générateur séquentiel (par ex. user134_item1
, user134_item2
) si vous avez besoin d'unicité et non d'imprévisibilité. Vous pouvez "hacher" la chaîne générée séquentiellement pour récupérer l'imprévisibilité.
Les UID générés à l'aide de Math.random
n'est pas sûr (et vous ne devriez pas faire confiance au client de toute façon). Faire no se fier à son caractère unique ou imprévisible dans les tâches critiques.