Ruby UUID и уникальность, для ID - PullRequest
0 голосов
/ 16 марта 2011

Мне нужен 6-значный буквенно-цифровой идентификатор для использования в моем приложении rails, которое будет представлено пользователям системы и должно быть уникальным среди всех экземпляров объектов в моей системе.Я не ожидаю более нескольких тысяч экземпляров объектов, поэтому 6 символов - это гораздо больше, чем мне действительно нужно.

На данный момент я использую гем UUIDTools в своем приложении Rails для генерации uuid.Какой из методов генерации UUIDTools мне следует использовать, и с какого конца полученного uuid я должен взять 6 символов, чтобы гарантировать уникальность? Например,

, если я генерирую ef1cf087-95c9-4868-bd95-cea950a52b58, хочу ли я использоватьef1cf0 от передней части, или a52b58 от задней части?

... в качестве примечания / вопроса: я что-то не так делаю?есть ли лучший способ?

Ответы [ 2 ]

6 голосов
/ 16 марта 2011

Ни за что.UUID считается уникальным, потому что он очень длинный и практически невозможно сгенерировать одинаковые UUID.Если вы урежете его до 6 символов, то вы резко увеличите возможность дублирования.Вы должны использовать либо инкрементный идентификатор, либо полный UUID.

Только детерминированная генерация (id(x + 1) = id(x) + 1) может гарантировать уникальность.UUID не гарантирует его , а 6 символов гарантируют его еще меньше.

Другой вариант заключается в создании службы генерации идентификатора, он будет иметь единственный метод getNewId и сохранит знания,достаточно, чтобы предоставить уникальные идентификаторы.(Простейший случай - счетчик)

3 голосов
/ 16 марта 2011

Когда вы говорите, что увеличение идентификатора не вариант, это потому, что вы не хотите, чтобы пользователи видели схему, которую вы используете, или потому что генерация должна быть без сохранения состояния (т. Е. Вы не можете отслеживать всех сгенерированных вами идентификаторов)?

Если это первое, то вы можете сгенерировать идентификатор, проверить, не использовали ли вы его уже, и, если да, сгенерировать другой новый идентификатор. (Кажется довольно очевидным, так что извините, если я на неправильном пути.) Вы могли бы сделать что-то вроде этого:

while id = rand(2**256).to_s(36)[0..5] 
   break unless Ids.exists?(id)
end

, где Ids.exists?(id) - метод «уже существует».

...