Подтвердить что ты не робот

Создание короткого уникального идентификатора объекта в MongoDB

Я делаю приложение, похожее на instagram, используя Rails/Mongoid. Я хочу уникальный идентификатор, который я могу использовать в URL-адресе, например http://instagr.am/p/DJmU8/

Какой самый простой способ сделать это? Могу ли я получить такой идентификатор из стандартного BSON ObjectID Mongo создает?

4b9b3361

Ответ 1

Вы можете попытаться использовать первые 4 байта ObjectID (они будут представлять метку времени).

Но, чтобы быть на 100% безопасным, лучше создать действительно уникальный короткий идентификатор с помощью счетчика. Вы можете использовать отдельную коллекцию для поддержания текущей стоимости вашего счетчика.

Более подробную информацию о структуре ObjectID Монго можно найти здесь: http://www.mongodb.org/display/DOCS/Object+IDs

В качестве альтернативы вы можете преобразовать преобразование шестнадцатеричного представления идентификатора строки в представление, основанное на 36 символах (26 латинских букв + 10 цифр). Это будет очевидно короче.

Кажется, что есть библиотека ruby, которая может делать такие преобразования http://rubyworks.github.com/radix/

Ответ 2

Вы можете попробовать Mongoid:: Token

https://github.com/thetron/mongoid_token

Из документов:

Эта библиотека представляет собой быстрый и простой способ генерации уникальных случайных жетоны для ваших документов с мангой, в тех случаях, когда вы не можете, или не хотите использовать слизняки или идентификаторы MongoDB по умолчанию.

Mongoid:: Token может помочь это сделать:

http://myawesomewebapp.com/video/4dcfbb3c6a4f1d4c4a000012/edit

В нечто более похожее:

http://myawesomewebapp.com/video/83xQ3r/edit

Ответ 3

Почему бы не использовать dylang/shortid?

В мангусте:

_id: {
    type: String,
    'default': shortid.generate
},

или просто вставить напрямую:

users.insert({
    _id: shortid.generate()
    name: ...
    email: ...
    });

Ответ 5

Библиотека Hashids предназначена для генерации идентификаторов, подобных этому. Проверьте это здесь ☞ https://github.com/peterhellberg/hashids.rb

Ответ 6

@aav упоминалось, что вы можете использовать первые 4 байта, но это значение указано в секундах, и вы можете получить даже 10.000 или более вставок в секунду. Другая вещь, objectID - Uniq, и вам нужно проверить, "когда" вы получаете ошибку от повторяющегося значения "Записать проблемы"?

new Date(). getTime() - в миллисекундах => 1557702577900 почему бы не использовать последние 4 байта?

Этот код выглядит интересно:

https://github.com/treygriffith/short-mongo-id/blob/master/lib/objectIdToShortId.js

Проверьте также анализатор меток времени ObjectID:

https://steveridout.github.io/mongo-object-time/

Или вы можете выполнить ObjectId(). ToString(), и база этой строки создаст новый с помощью hashids [nodejs, php, andmanymore]

Возможно, лучше всего использовать 4-5 байт из js timestamp и INC из bson, а затем хэшировать это значение с помощью hids

enter image description here

Database 3milion rows numeric increment "_id" size on disk => 76MB, default object id => 86MB

Ответ 7

Хорошо использовать ObjectID в качестве уникального идентификатора, вы можете создать его с помощью драйверов базы данных MongoDB с помощью ObjectID.

Этот уникальный идентификатор является следующим:

  1. во-первых, 4 байта это секунды
  2. второе 5-байтовое случайное значение
  3. третий 3-х байтовый случайный счетчик

Вы можете создать его с помощью ObjectID():

const mongo = require('mongodb')
let uniqueObjectId =  = new mongo.ObjectID();

Вы можете создать уникальный идентификатор вручную, используя идентификатор процесса, временную метку, случайный идентификатор и перемешать полную строку.

let processId = process.pid;
//create randomId with length of 30
var randomId = '';
var characters = 'abcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for (var i = 0;i < 30;i++) {
    randomId += characters.charAt(Math.floor(Math.random() * charactersLength));
}

let timestemp = parseInt(Date.now() / 1000, 10);
let fullUniqString = processId + randomId + timestemp;
let uniqueObjectId = fullUniqString.split('').sort(function () { return 0.5 - Math.random() }).join('');
console.log(uniqueObjectId);