Вопрос по javascript, node.js – Nodejs генерирует короткие уникальные буквенно-цифровые
Я хотел бы создать короткое уникальное буквенно-цифровое значение, которое будет использоваться в качестве кодов подтверждения для покупок в Интернете. Я смотрю вhttps://github.com/broofa/node-uuid но их uuids слишком длинные, и я хочу, чтобы они были длиной около 8 символов. Как лучше всего этого добиться?
10/23/15: See the hashids answer below, as well!
Вы можете позаимствовать у модели сокращения URL и сделать что-то вроде этого:
(100000000000).toString(36);
// produces 19xtf1ts
(200000000000).toString(36);
// produces 2jvmu3nk
Просто увеличьте число, чтобы оно оставалось уникальным:
function(uniqueIndex) {
return uniqueIndex.toString(36);
}
Note что это действительно полезно только для «одного экземпляра» услуги, которые не возражают против определенной степени предсказуемости в том, как это заказано (через базовый прирост). Если вам нужно действительно уникальное значение для нескольких экземпляров приложения / БД, вам следует рассмотреть более полнофункциональный вариант для некоторых комментариев.
вы можете использоватьsimple-short пакет, который не требует подключения к базе данных или веб-служб:
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
Установите модуль shortId (https://www.npmjs.com/package/shortid). By default, shortid generates 7-14 url-friendly characters: A-Z, a-z, 0-9, _- but you can replace - and _ with some other characters if you like. Now you need to somehow stick this shortId to your objects when they're being saved in the database. Best way is to stick them in Schema like this:
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}
});
Я уже ответил на подобный вопрос себе здесь:
но похоже, что хешид будет хорошо работать для этого сценария.
https://github.com/ivanakimov/hashids.node.js
hashids (Hash ID's) creates short, unique, decryptable hashes from unsigned integers
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 ]
Если вы хотите нацелить ~ 8 символов, вы можете сделать следующее, что требует минимум 8 символов.
hashids = new Hashids("this is my salt", 8);
тогда это:
hash = hashids.encrypt(1);
// hash is now 'b9iLXiAa'
Принятый ответ будет предсказуемым / предполагаемым, это решение должно быть уникальным и непредсказуемым.
https://www.npmjs.com/package/randomstring
var randomstring = require("randomstring");
randomstring.generate();
// >> "XwPp9xazJ0ku5CZnlmgAx2Dld8SHkAeT"
randomstring.generate(7);
// >> "xqm5wXX"
randomstring.generate({
length: 12,
charset: 'alphabetic'
});
// >> "AqoTIzKurxJi"
randomstring.generate({
charset: 'abc'
});
// >> "accbaabbbbcccbccccaacacbbcbbcbbc"
вы можете сделать это
randomstring.generate({
length: 8,
charset: 'alphabetic'
});