Как сгенерировать уникальные 64-битные ключи - PullRequest
1 голос
/ 30 августа 2011

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

Обычные GUID пока не обсуждаются, потому что у нас дешевые данные :). Поскольку я не предполагаю, что потребуется более 1 миллиона ключей, используемых в одном и том же контексте, я думаю, что достаточно 64-битного (вероятность коллизии будет около ~ 10e-7).

В качестве дополнительного примечания мне также понадобится схема для свертывания / хеширования этих ключей в один 64-битный ключ, который также должен быть хорошо распределенным / уникальным.

Поскольку в любом случае мне нужна хорошая (хорошо распределенная) функция хеширования, можно ли было бы сложить GUID пополам (возможно, каким-то образом учесть фиксированные биты в GUID)? Или лучше использовать местный ГСЧ? Как бы я посеял ГСЧ, чтобы максимизировать уникальность в пространстве / времени генерации? Как мне понадобится сильный ГСЧ?

Я не особо ищу эффективность (до определенного момента), но мне бы очень хотелось, чтобы вероятности выполнили свое обещание!

1 Ответ

2 голосов
/ 30 августа 2011

хеш счетчик с использованием быстрого 128-битного криптографического хеша, как md5, а затем разделить на две части.это даст вам «случайные», независимые значения по 64 бита каждое, и оно должно быть довольно эффективным.

и вы уверены, что не можете использовать простой счетчик?

Обновите , если вам нужно распределенное решение, просто поместите счетчик на каждую машину и хэшируйте MAC-адрес машины плюс счетчик.для повышения пропускной способности используйте несколько счетчиков для каждой машины, каждая из которых имеет свое имя (A, B и т. д.), а также хэшируйте имя.это большое преимущество использования хэшей - вы можете добавить туда что угодно.просто будьте осторожны, чтобы не было двусмысленностей (например, ставьте «-» между каждой хэш-переменной, чтобы имя «1» плюс число «23» не путалось с именем «12» и числом"3").

...