2012-06-11 2 views
13

Je souhaite générer une valeur alphanumérique unique et courte à utiliser comme codes de confirmation pour les achats en ligne. J'ai regardé dans https://github.com/broofa/node-uuid mais leurs uuids sont trop longs et je veux les avoir environ 8 caractères longs. Quelle est la meilleure façon de le faire?Les noeuds génèrent des caractères alphanumériques courts et uniques.

+4

unique et court ne vont pas de pair sauf si vous pouvez garantir qu'ils ont une origine unique, ou avoir une méthode d'imbrication pour que deux serveurs ne génèrent pas les mêmes chaînes. – Brad

+1

Si vous utilisez une fonction de hachage, vous pouvez essayer de déterminer la sous-chaîne la plus courte possible du résultat du hachage, de la même manière que git est une abréviation des hachages de commit. – TheHippo

Répondre

32

23/10/15: Voir également la réponse aux hashids ci-dessous!

Vous pouvez emprunter à partir du modèle de raccourcisseur d'URL et faire quelque chose comme ceci:

(100000000000).toString(36); 
// produces 19xtf1ts 

(200000000000).toString(36); 
// produces 2jvmu3nk 

incrémenter juste le nombre de garder unique:

function(uniqueIndex) { 
    return uniqueIndex.toString(36); 
} 

Remarque que ce n'est vraiment utile pour les services à "instance unique" qui ne se préoccupent pas d'une certaine prévisibilité de la manière dont cela est ordonné (par incrément de base). Si vous avez besoin d'une valeur vraiment unique à travers un certain nombre d'instances d'applications/DB, vous devriez vraiment envisager une option plus complète pour certains des commentaires.

+2

Merci pour le conseil. J'ai fini par utiliser quelque chose de similaire à ce que vous avez fourni: var now = new Date(); Math.floor (Math.random() * 10) + parseInt (now.getTime()). ToString (36) .toUpperCase() – teggy

+1

Qu'est-ce que 'parseInt' ajoute? Est-ce que '(100000000000) .toString (36)' ne fonctionnerait pas aussi bien? – JohnnyHK

+0

Oui, il le ferait. Je voulais juste clarifier ce qui se passait. –

33

Un peu en retard sur celui-ci mais il semble que les hashids fonctionneraient plutôt bien pour ce scénario.

https://github.com/ivanakimov/hashids.node.js

hashids (de Hash ID) crée court, hash unique, déchiffrable d'entiers non signés

var Hashids = require('hashids'), 
hashids = new Hashids('this is my salt'); 

var hash = hashids.encrypt(12345); 
// hash is now 'ryBo' 

var numbers = hashids.decrypt('ryBo'); 
// numbers is now [ 12345 ] 

Si vous souhaitez cibler ~ 8 caractères que vous pourriez faire, ce qui suit que appelle pour un minimum de 8 caractères.

hashids = new Hashids("this is my salt", 8); 

alors ceci:

hash = hashids.encrypt(1); 
// hash is now 'b9iLXiAa' 

La réponse acceptée serait prévisible/devinables, cette solution doit être unique et imprévisible.

+0

Mises à jour des hashids à partir de la version 1.0.0. Plusieurs fonctions publiques sont renommées pour être plus appropriées: ** Fonction encrypt() changée pour encoder() **, ** Fonction decrypt() changée en decode() **, ** Fonction encryptHex() changée en encodeHex() **, ** Fonction decryptHex() modifiée en decodeHex() ** –

+0

Le lien est rompu. –

+0

Voici le [nouveau lien] (https://github.com/ivanakimov/hashids.js). – cowgill

0

Installez le module shortId (https://www.npmjs.com/package/shortid). Par défaut, shortid génère 7-14 caractères conviviaux: A-Z, a-z, 0-9, _- mais vous pouvez remplacer - et _ par d'autres caractères si vous le souhaitez. Maintenant, vous devez coller ce shortId à vos objets lorsqu'ils sont enregistrés dans la base de données. La meilleure façon est de les coller dans le schéma comme celui-ci:

var shortId = require('shortid'); 
var PurchaseConfirmationSchema = mongoose.Schema({ 
    /* _id will be added automatically by mongoose */ 
    shortId: {type: String, unique: true, default: shortId.generate}, /* WE SHOULD ADD THIS */ 
    name: {type: String}, 
    address: {type: String} 
}); 

je l'ai déjà répondu à la question similiar à moi-même ici:

Shorten ObjectId in node.js and mongoose

+1

Salut, est shortId va donner une chaîne unique même après le redémarrage du serveur? –

+1

Mais il nécessite un dictionnaire d'exactement 64 caractères, donc il ne va pas être alphanumérique même si vous remplacez - et _. –

0

A cet effet, j'ai écrit un module qui peut fais cela et toujours plus. Regardez la page: id-shorter

0

IF chaque achat en ligne associé à l'URL unique, vous pouvez utiliser le back-end du paquet simple-short, qui ne nécessitent pas de connexion de base de données, ni les services Web:

var shorten=require('simple-short'); 

shorten.conf({length:8}); // Default is 4. 

code1=shorten('http://store.com/purchase1'); 
code2=shorten('http://store.com/purchase2'); 
//.. so on 
Questions connexes