UUID в неподписанном int - PullRequest
       3

UUID в неподписанном int

3 голосов
/ 20 октября 2011

Есть ли где-нибудь сжать / преобразовать / кодировать / зашифровать UUID в беззнаковый int?

Я читаю UUID из таблицы sql, история ужасна, и я не могу ее изменить ... У меня есть только целое число без знака для хранения. Это C ++ на случай, если что-то изменится

Есть мысли по этому поводу?

Спасибо Реза

Ответы [ 3 ]

7 голосов
/ 20 октября 2011

Как уже говорили другие, вы потеряете информацию, переводя 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-разрядных чисел, вероятно, что два из них будут одинаковыми.См. Парадокс Дня Рождения .

1 голос
/ 20 октября 2011

Используйте CRC32 UUID (я предполагаю, что вы имеете в виду 32-разрядное целое число). Очевидно, что существует вероятность столкновения, но если оно происходит, оно должно быть достаточно редким, вы можете просто исправить это вручную.

Обратите внимание, что если это MS SQL Server, вы можете использовать функцию CHECKSUM, чтобы сделать хэш crc32 на сервере для обновления таблицы.

0 голосов
/ 20 октября 2011

Возможно, вы могли бы использовать хеш-функцию для преобразования UUID в всегда положительное число и сохранения номера в целое число без знака?

...