Создание удобочитаемых / пригодных для использования, коротких, но уникальных идентификаторов


  • нужно обрабатывать > 1000 но

  • нельзя использовать GUID / UUIDs, номера автоматического приращения и т. д.

  • в идеале должно быть 5 или 6 символов длиной, может быть альфа конечно

  • хотел бы повторно использовать существующие, хорошо известные algos, если таковые имеются

что-нибудь есть ?

4 56

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.