Создание удобочитаемых / пригодных для использования, коротких, но уникальных идентификаторов
нужно обрабатывать > 1000 но
нельзя использовать GUID / UUIDs, номера автоматического приращения и т. д.
в идеале должно быть 5 или 6 символов длиной, может быть альфа конечно
хотел бы повторно использовать существующие, хорошо известные algos, если таковые имеются
что-нибудь есть ?
4 ответа:
основание 62 использовано tinyurl и bit.ly для сокращенных URL-адресов. Это хорошо понятный метод для создания "уникальных", удобочитаемых идентификаторов. конечно, вам придется хранить созданные идентификаторы и проверять наличие дубликатов при создании, чтобы обеспечить уникальность. (см. код в нижней части ответа)
база 62 метрики уникальности
5 символов в базе 62 даст вам 62^5 уникальных идентификаторов = 916,132,832 (~1 миллиард) На 10k IDs в день Вы будете будет хорошо для 91k+ дней
6 символов в базе 62 даст вам 62^6 уникальных идентификаторов = 56,800,235,584 (56 + млрд) На 10к идентификаторы в сутки вы будете хорошо на 5+ миллионов дней
база 36 метрик уникальности
6 символов даст вам 36^6 уникальных идентификаторов = 2,176,782,336 (2+ млрд)
7 символов даст вам 36^7 уникальных идентификаторов = 78,364,164,096 (78+ миллиард)
код:
public void TestRandomIdGenerator() { // create five IDs of six, base 62 characters for (int i=0; i<5; i++) Console.WriteLine(RandomIdGenerator.GetBase62(6)); // create five IDs of eight base 36 characters for (int i=0; i<5; i++) Console.WriteLine(RandomIdGenerator.GetBase36(8)); } public static class RandomIdGenerator { private static char[] _base62chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" .ToCharArray(); private static Random _random = new Random(); public static string GetBase62(int length) { var sb = new StringBuilder(length); for (int i=0; i<length; i++) sb.Append(_base62chars[_random.Next(62)]); return sb.ToString(); } public static string GetBase36(int length) { var sb = new StringBuilder(length); for (int i=0; i<length; i++) sb.Append(_base62chars[_random.Next(36)]); return sb.ToString(); } }
выход:
z5KyMg wd4SUp uSzQtH UPrGAT UIf2IS QCF9GNM5 0UV3TFSS 3MG91VKP 7NTRF10T AJK3AJU7
Я рекомендую http://hashids.org/ который преобразует любое число (например, DB ID) в строку (с использованием соли).
это позволяет декодировать эту строку обратно в число. так что вам не нужно хранить его в базе данных.
имеет библиотеки для JavaScript, Ruby, Python, Java, Scala, PHP, Perl, Swift, Clojure, Objective-C, C, C++11, Go, Erlang, Lua, Elixir, ColdFusion, Groovy, Kotlin, Nim, VBA, CoffeeScript и для узла.js&. NET.
У меня были похожие требования, как ОП. Я посмотрел на существующих библиотек, но большинство из них основаны на случайностях, и я не хочу. Я действительно не мог найти ничего, что не было основано на случайных и весьма коротким... Так что я в конечном итоге прокатки мой собственный на основе техника Flickr использует, но изменено, чтобы потребовать меньше координации и разрешить более длительные периоды в автономном режиме.
короче:
- центральный сервер выдает ID блоков, состоящих из 32 Идентификаторы каждый
- локальный генератор идентификаторов поддерживает пул блоков идентификаторов для генерации идентификатора каждый раз, когда он запрашивается. Когда пул заканчивается, он получает больше блоков идентификаторов с сервера, чтобы снова заполнить его.
недостатки:
- требует централизованной координации
- идентификаторы более или менее предсказуемы (меньше, чем обычные идентификаторы БД, но они не случайны)
преимущества
- остается в пределах 53 бит (Javascript / PHP максимальный размер для целых чисел)
- очень короткие идентификаторы
- база 36 закодирована так легко для людей, чтобы читать, писать и произносить
- идентификаторы могут быть созданы локально в течение очень долгого времени, прежде чем снова потребуется связаться с сервером (в зависимости от настроек пула)
- теоретически нет шансов на столкновения
Я опубликовал как библиотеку Javascript для клиентской стороны, так и сервер Java EE реализация. Реализация серверов на других языках также должна быть простой.
вот проекты:
suid - Распределенный сервис-уникальные идентификаторы, которые являются короткими и сладкими
suid-server-java - реализация Suid-сервера для стека технологий Java EE.
обе библиотеки доступны под либеральной лицензией Creative Commons open source. Надеюсь, это может помочь кому-то еще ищу короткие уникальные идентификаторы.
Я база 36 когда я решил эту проблему для приложение я разрабатывал пару лет назад. Мне нужно было создать человек читаемый разумно уникальный номер (в течение текущего календарного года в любом случае). Я решил использовать время в миллисекундах с полуночи 1 января текущего года (поэтому каждый год метки времени могут дублироваться) и преобразовать его в базовое число 36. Если разрабатываемая система столкнулась с фатальной проблемой, она сгенерировала базу 36 номер (7 символов), который был показан конечному пользователю через веб-интерфейс, который затем мог передать возникшую проблему (и номер) специалисту технической поддержки (который затем мог использовать его, чтобы найти точку в журналах, где stacktrace начал). Число вроде 56af42g7 бесконечно легче для пользователя читать и ретранслировать, чем метку времени, как 2016-01-21T15:34:29.933-08:00 или случайный UUID, как 5f0d3e0c-da96-11e5-b5d2-0a1d41d68578.