Как уже говорили другие, вы потеряете информацию, переводя 128-битный UUID в более узкий целочисленный тип.
Если вы хотите гарантировать уникальность - ну, это и есть UUIDв конце концов, и вы могли бы просто рассмотреть вопрос о сохранении информации в формате UUID.
Если вы можете согласиться на малую вероятность коллизий (два разных UUID, сопоставляемых одному и тому же целому числу), есть несколько вещей, которые вы можетеtry.
Используйте как можно больший целочисленный тип.Если ваш компилятор поддерживает 64-битный целочисленный тип без знака (unsigned long long
или как его называет Microsoft), используйте его.
xor
, если верхняя и нижняя 64-битные половины UUID должны дать вамдостаточно приличный хэш.
Если в значениях UUID есть какой-то порядок (не случайность, предсказуемость), который делает это неподходящим, вы можете вычислить хэш md5 или sha-1 и отбросить все, кроме 64 бит.Неважно, какие биты вы отбрасываете.
Если вы ограничены 32-битным целым числом, вы можете xor
четыре 32-битных четверти UUID вместе или отбросить все, кроме 32 битхэша md5 или sha-1.
Обратите внимание, что в случае 32-разрядных целых чисел вы можете столкнуться с двумя первыми выборками, но это маловероятно.Вероятность столкновения возрастает примерно до 50% с количеством выборок где-то около квадратного корня от общего числа возможностей, поэтому, если у вас 100 000 случайных 32-разрядных чисел, вероятно, что два из них будут одинаковыми.См. Парадокс Дня Рождения .