Вопрос по javascript, node.js – Nodejs генерирует короткие уникальные буквенно-цифровые

14

Я хотел бы создать короткое уникальное буквенно-цифровое значение, которое будет использоваться в качестве кодов подтверждения для покупок в Интернете. Я смотрю вhttps://github.com/broofa/node-uuid но их uuids слишком длинные, и я хочу, чтобы они были длиной около 8 символов. Как лучше всего этого добиться?

Уникальные и короткие не идут рука об руку, если вы не можете гарантировать, что они имеют единственное начало или какой-то метод блокировки, чтобы два сервера не генерировали одинаковые строки. Brad
Если вы используете хеш-функцию, вы можете попытаться определить самую короткую из возможных в настоящее время подстроку результата хеша, аналогично тому, как git сокращает хеши фиксации. TheHippo

Ваш Ответ

6   ответов
35

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 что это действительно полезно только для «одного экземпляра» услуги, которые не возражают против определенной степени предсказуемости в том, как это заказано (через базовый прирост). Если вам нужно действительно уникальное значение для нескольких экземпляров приложения / БД, вам следует рассмотреть более полнофункциональный вариант для некоторых комментариев.

альтернативно:Array.apply(0, Array(n)).reduce(function(p){return p + (Math.random() * 1e18).toString(36)}, '') будет генерировать около (12 *n) длина строки
@teggy, какой смысл использовать случайные?(+new Date()).toString(36) должен дать вам уникальный идентификатор.
Единственный недостаток этого подхода заключается в том, что он не гарантирует уникальность в параллельных средах. Две машины или процессы могут генерировать код одновременно, и у вас могут возникнуть конфликты.
Что этоparseInt добавлять? Wouldn & APOS; т(100000000000).toString(36) работать так же хорошо?
Спасибо за чаевые. В итоге я использовал нечто похожее на то, что вы предоставили: var now = new Date (); Math.floor (Math.random () * 10) + parseInt (now.getTime ()). ToString (36) .toUpperCase () teggy
0

вы можете использовать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 
0

Установите модуль 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}
});

Я уже ответил на подобный вопрос себе здесь:

Shorten ObjectId in node.js and mongoose

Но для этого требуется словарь, состоящий ровно из 64 символов, поэтому он не будет буквенно-цифровым, даже если вы замените - и _.
Привет, shortId выдаст уникальную строку даже после перезапуска сервера?
35

но похоже, что хешид будет хорошо работать для этого сценария.

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'

Принятый ответ будет предсказуемым / предполагаемым, это решение должно быть уникальным и непредсказуемым.

Ссылка не работает.
шифрование & amp; расшифровка, вероятно, является дорогостоящей операцией для простой генерации идентификатора
Обновления хешей с 1.0.0. Несколько открытых функций переименованы, чтобы быть более подходящими:Function encrypt() changed to encode(), Function decrypt() changed to decode(), Function encryptHex() changed to encodeHex(), Function decryptHex() changed to decodeHex()
Здесьnew link.
0

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

Посмотрите на его странице:ID-короче

Похожие вопросы