Я понимаю, что это старый вопрос, но я наткнулся на него, нашел гораздо лучший подход и решил поделиться им.
У вас есть верхняя граница для вашего порядкового номера N, поэтому давайте воспользуемся преимуществомтого, что.Допустим, N <2 <sup>32 ≈ 4,3 * 10 10 .Теперь каждый раз, когда вам нужен новый идентификатор, вы просто выбираете случайное 32-битное число R и объединяете его с R xor N (нулевое число перед объединением).Это дает случайный выглядящий уникальный 64-битный идентификатор, который можно обозначить всего 16 шестнадцатеричными цифрами.
Этот подход полностью предотвращает коллизии, потому что два идентификатора, которые случайно имеют один и тот же случайный компонент, обязательно имеют разные xor-ed компоненты.
Бонусная функция: вы можете разбить такой 64-битный идентификатор на два 32-битных числа и переписать их друг с другом, чтобы восстановить исходный порядковый номер.