2010-07-15 3 views
7

Мне нужно создать уникальную строку длиной 30 символов. Сначала я собирался создать GUID и просто удалить первые два символа.GUID, 30 символов случайной строки

Guid.NewGuid().ToString("N").Substring(2); 

Устранение двух первых символов оказывает значительное влияние на «уникальность»? Это что-то, о чем я должен беспокоиться?

Есть ли лучший способ генерации случайной строки из 30 символов, которая будет гарантирована быть уникальной?

ответ

5

Удаление двух шестнадцатеричных символов или эквивалентных 8 бит из GUID сделает его менее уникальным, но 120 бит по-прежнему составляют довольно хорошее уникальное значение. Если вы не хотите генерировать миллионы идентификаторов каждую секунду, должно быть безопасно удалить некоторые биты из метки времени и uniquifier, не рискуя столкнуться. См. Например, Википедию для structure of GUIDs.

Альтернативным решением было бы кодирование GUID в Base64 или что-то в этом роде, если вы не ограничиваетесь только шестнадцатеричными символами. 128 бит, закодированных в Base64, дают строку длиной 24. Тогда вы можете даже добавить еще 6 случайных символов, чтобы вставить строку до 30 символов, что делает ее еще более уникальной.

+0

13-й символ (GUID генерируется в .NET) всегда кажется, что «4». Я предполагаю, что это один из фиксированных байтов, которые я могу удалить. Где будет располагаться метка времени или уникальный идентификатор? – harmony

+0

4 указывает версию алгоритма, используемого для генерации GUID. См. Http://msdn.microsoft.com/en-us/library/cc246027.aspx и RFC, упомянутые там для внутренней структуры. –

5

Усечение GUID теряет уникальность. Чтобы понять, почему вы должны понимать, как создается GUID. Она состоит из нескольких частей:

  • 60 бита временной метки
  • 48 бит компьютерного идентификатора
  • 14 битых uniquifier
  • 6 бит являются фиксированными

отбрасывания первых два символов вы отбрасываете 8 наиболее значимых бит части метки времени. This article объясняет это хорошо и опасности усечения GUID. В нем также объясняется, как вы можете использовать тот же метод, который используется в GUID для создания уникальных идентификаторов, которые не являются глобально уникальными, но будут уникальными для более ограниченных условий.

1

Как другие ответчики сказали передо мной, если вы просто удалите два символа из GUID, то это не будет уникальным.

Но есть и другой способ: можно сократить GUID до 20 символов без потери информации или уникальности с помощью кодирования ASCII.

Заканчивать этот пост в блоге Джефф Этвуд:
Coding Horror: Equipping our ASCII Armor

Смежные вопросы