Возможность создания 8-байтового уникального идентификатора для объекта - PullRequest
1 голос
/ 16 апреля 2019

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

В настоящее время используется популярная библиотека UUID, но UUID - это 128-битное число. Согласно дизайну моей системы, типа int более чем достаточно. Если UID может быть переработан, 8-байт должен быть в порядке. Поэтому я думаю, что есть много места для оптимизации.

Например:

bool isEqual(const char *uid1, const char *uid2) {
    return strcmp(uid1, uid2) == 0;
}

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

bool isEqual(int uid1, int uid2) {
    return uid1 == uid2;
}

Но я не знаю сейчас, что есть зрелые библиотеки, которые отвечают моим потребностям.

Итак, я хочу спросить вас:

  • Насколько это возможно, если я сам это осуществлю?
  • С какими трудностями я столкнусь?
  • На что следует обратить внимание?
  • Есть ли библиотека, которая уже реализует подобные функции?
  • Стоит ли?

Кстати, я могу использовать C / C ++ / lua.

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Если вы хотите создать пользовательский выделенный пользовательский идентификатор в полностью управляемой распределенной системе, у вас есть 3 возможности:

  1. Центральная система генерирует просто последовательные значения, а другие системы запрашивают его для каждого нового идентификатора пользователя.Простой и полностью детерминированный, но генератор является единственной точкой отказа
  2. Каждая (логическая) система получает идентификатор и объединяет его с локальным серийным номером.Например, если число систем превышает 32000, вы можете использовать 16 бит для идентификатора системы и 48 бит для последовательного порта.Полностью детерминированный, но требует от администратора дать каждой системе свой идентификатор
  3. Случайный.Высококачественные генераторы случайных чисел, соответствующие криптографическим требованиям, должны давать псевдоид с низкой вероятностью столкновения.Но это только вероятность, поэтому столкновение все еще возможно.

Указывает обратить внимание на:

  • условия гонки.Если для генератора может быть несколько процессов, вы должны убедиться, что генерация uid правильно синхронизирована
  • reid reid.Если вся система должна быть рассчитана на то, чтобы жить достаточно долго, чтобы исчерпать последовательный генератор, вам нужно будет где-то список все еще существующих объектов и их uid
  • для вероятностного решения,Риск столкновения пропорционален максимальному количеству одновременных объектов.Вам следует тщательно оценить эту вероятность и оценить, может ли риск быть принят.

Такие решения уже внедрены?

Да, в системах баз данных, которые позволяют автоматическую генерацию идентификатора.

Стоит ли?

Только вы можете сказать ...

0 голосов
/ 16 апреля 2019

У нас есть крошечный, безопасный, уникальный генератор идентификаторов строк для Python, который позволяет уменьшить длину идентификатора (но увеличить вероятность коллизий), вы можете передать длину в качестве аргумента. Для использования в python env:

пункт установки наноида

from nanoid import generate

generate(size=10) => u'p1yS9T21Bf'

Чтобы проверить, как генерируются идентификаторы, и вероятность их столкновения для данной продолжительности посещения https://zelark.github.io/nano-id-cc/

См .: https://pypi.org/project/nanoid/

...