2012-06-11 22 views
13

Me gustaría generar un valor alfanumérico único breve para usar como códigos de confirmación para compras en línea. He buscado en https://github.com/broofa/node-uuid pero sus uidos son demasiado largos y quiero que tengan alrededor de 8 caracteres. ¿Cuál es la mejor manera de lograr esto?Nodejs genera caracteres alfanuméricos únicos cortos

+4

único y corto no vaya de la mano a menos que pueda garantizar que tienen un solo origen, o tienen algún método de enclavamiento para que dos servidores no generen las mismas cadenas. – Brad

+1

Si usa una función hash, podría tratar de determinar la subcadena más corta posible del resultado hash, similar a la forma en que abreviar los hashes de commit. – TheHippo

Respuesta

32

10/23/15: ¡Vea también la respuesta de los hashids abajo!

Usted puede pedir prestado a partir del modelo acortador de URL y hacer algo como esto:

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

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

sólo se incrementa el número de mantenerlo único:

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

Nota que esto sólo es realmente útil para servicios de "instancia única" a los que no les importa una cierta cantidad de previsibilidad en la forma en que esto se ordena (a través del incremento básico). Si necesita un valor realmente único en varias instancias de aplicación/base de datos, realmente debería considerar una opción más completa en función de algunos de los comentarios.

+2

Gracias por el consejo. Terminé usando algo similar a lo que me proporcionó: var now = new Date(); Math.floor (Math.random() * 10) + parseInt (now.getTime()). ToString (36) .toUpperCase() – teggy

+1

¿Qué agrega el 'parseInt'? ¿No funcionaría '(100000000000) .toString (36)' igual de bien? – JohnnyHK

+0

Sí, lo haría. Solo quería dejar en claro lo que estaba sucediendo. –

33

Un poco tarde en esto, pero parece que los hashids funcionarían bastante bien para este escenario.

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

hashids (Hash ID) crea, único, hashes descodificarse cortos de enteros sin signo

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 desea orientar ~ 8 caracteres que podía hacer, el siguiente al requiere un mínimo de 8 caracteres.

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

entonces esto:

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

la respuesta aceptada sería predecible/guessable, esta solución debe ser única e impredecible.

+0

Actualizaciones en hashids desde 1.0.0. Varias funciones públicas se renombran para ser más apropiadas: ** Cifrado de función() cambiado a codificar() **, ** Descifrar la función() cambiado a decodificar() **, ** La función encryptHex() cambió a encodeHex() **, ** Función decryptHex() cambiado a decodeHex() ** –

+0

El enlace está roto. –

+0

Aquí está el [nuevo enlace] (https://github.com/ivanakimov/hashids.js). – cowgill

0

Instalar el módulo shortId (https://www.npmjs.com/package/shortid). De forma predeterminada, shortid genera de 7 a 14 caracteres compatibles con las URL: A-Z, a-z, 0-9, _- pero puede reemplazarlos -y _ con algunos otros caracteres si lo desea. Ahora necesita de alguna manera pegar este shortId a sus objetos cuando se guardan en la base de datos. La mejor manera es pegarlas en el esquema como éste:

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} 
}); 

ya he respondido a la pregunta similar a mí mismo aquí:

Shorten ObjectId in node.js and mongoose

+1

Hola, ¿shortId dará una cadena única incluso después de reiniciar el servidor? –

+1

Pero requiere un diccionario de exactamente 64 caracteres, por lo que no será alfanumérico aunque reemplace - y _. –

0

Para ello escribí un módulo que puede haz eso y cada vez más. mirada en su página: id-shorter

0

si cada compra en línea asociada a la URL único, puede utilizar el backend de simple-short paquete, que no requiere conexión a la base de datos, ni los servicios 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 
Cuestiones relacionadas