Вырубить UUID дальше, чтобы сделать короткую строку - PullRequest
7 голосов
/ 19 августа 2009

Мне нужно создать уникальный идентификатор записи для данной уникальной строки.

Я попытался использовать формат uuid, который кажется хорошим.

Но мы чувствуем, что это долго.

поэтому нам нужно сократить строку uuid 9f218a38-12cd-5942-b877-80adc0589315 до меньшего размера. Убрав «-», мы можем сохранить 4 символа. Какую часть безопаснее всего удалить из uuid? Нам не нужен универсально уникальный идентификатор, но нам нравится использовать uuid в качестве источника, но сокращать строки.

Нам нужен уникальный идентификатор, специфичный для сайта / базы данных (службы данных SQL Server / ADO.NET).

Подойдет любая идея или образец с любого языка

Заранее спасибо

Ответы [ 5 ]

9 голосов
/ 19 августа 2009

Почему бы вместо этого просто не преобразовать его в строку base 64? Таким образом, вы можете сократить его до 22 символов.

Хранение UUID в виде base64 String

3 голосов
/ 19 августа 2009

Если вы используете MS-SQL, вам, вероятно, следует просто использовать тип данных uniqueindentifier, он является одновременно компактным (16 байт), и, поскольку механизм SQL знает об этом, он может оптимизировать индексы и запросы, используя его.

2 голосов
/ 20 августа 2009

UUID составляет 128 бит или 16 байтов. Без кодирования вы можете получить его всего до 16 байт. UUID обычно записываются в шестнадцатеричном формате, что делает их читаемыми 32-байтовыми строками. С другими кодировками вы получите другие результаты:

  1. base-64 превращает 3 8-битных байта в 4 6-битных символов, поэтому 16 байтов данных становятся длиной 22 символа
  2. base-85 превращает 4 8-битных байта в 5 6,4-битных символов, поэтому 16 байтов данных становятся длиной 20 символов

Все зависит от того, хотите ли вы читаемые строки и от того, какую стандартную / общую кодировку вы хотите использовать.

2 голосов
/ 20 августа 2009

UUID обеспечивает (почти) 128 бит уникальности. Вы можете сократить его до 16 двоичных байтов или до 22 символов в кодировке base64. Я бы не рекомендовал удалять какую-либо часть UUID, иначе он просто теряет смысл. UUID были разработаны так, чтобы все 128 бит имели значение. Если вы хотите меньше, используйте другую схему.

Например, если вы можете гарантировать, что используются только UUID версии 4, то вы можете взять только первые 32 бита или только последние 32 бита. Вы теряете уникальность, но у вас есть довольно случайные числа. Просто избегайте фиксированных битов (версия и вариант).

Но если вы не можете гарантировать это, у вас будут настоящие проблемы. Для идентификаторов UUID версии 1 первые биты не будут уникальными для идентификаторов UUID, сгенерированных в тот же день, и последние биты не будут уникальными для идентификаторов UUID, сгенерированных в той же системе. Даже если вы CRC UUID, не гарантируется, что у вас будет 16 или 32 бита уникальности.

В этом случае просто используйте другую схему. Сгенерируйте 32-битное случайное число, используя системный генератор случайных чисел, и используйте его в качестве уникального идентификатора. Не полагайтесь на UUID, если вы намерены сократить его длину.

0 голосов
/ 19 августа 2009

UUID имеет 128 бит. Рассматривали ли вы сделать CRC этого? Это может легко уменьшить его до 16 или 32 бит и использовать всю оригинальную информацию. Если CRC недостаточно хорош, вы всегда можете использовать первые несколько байтов правильного хэша (например, SHA256).

Если вы действительно хотите просто сократить UUID, его формат описан в RFC 4122 . Вы должны быть в состоянии выяснить, какие части вашей реализации не нужны из этого.

...