Какую часть GUID стоит больше всего? - PullRequest
14 голосов
/ 31 октября 2011

Мне нужно сгенерировать уникальный идентификатор, и я собирался сделать это для Guid.NewGuid, который генерирует нечто вродев конечном итоге будет жить, поэтому я планировал урезать его.

Вопрос в том, является ли один конец GUID более предпочтительным, чем остальные с точки зрения уникальности?Должен ли я отрезать начало, конец или убирать детали из середины?Или это просто не имеет значения?

Ответы [ 5 ]

14 голосов
/ 31 октября 2011

Сохраните все это.

По приведенной выше ссылке:

* Four bits to encode the computer number,
* 56 bits for the timestamp, and
* four bits as a uniquifier.

вы можете переопределить Guid, чтобы изменить его размердля ваших нужд.

13 голосов
/ 31 октября 2011

Вы можете сэкономить место, используя вместо этого строку base64:

var g = Guid.NewGuid();
var s = Convert.ToBase64String(g.ToByteArray());

Console.WriteLine(g);
Console.WriteLine(s);

Это сэкономит вам 12 символов (8, если вы не использовали дефисы).

7 голосов
/ 01 апреля 2014

Если бы GUID был просто случайным числом, вы могли бы хранить произвольное подмножество битов и иметь определенный процент вероятности столкновения, который вы можете вычислить с помощью " Алгоритма дня рождения ":

double numBirthdays = 365;  // set to e.g. 18446744073709551616d for 64 bits
double numPeople = 23;      // set to the maximum number of GUIDs you intend to store
double probability = 1; // that all birthdays are different 
for (int x = 1; x < numPeople; x++) 
   probability *= (double)(numBirthdays - x) / numBirthdays; 

Console.WriteLine("Probability that two people have the same birthday:");
Console.WriteLine((1 - probability).ToString());

Однако часто вероятность столкновения выше, потому что, на самом деле, GUID, как правило, НЕ случайны. Согласно статье GUID Википедии существует пять типов GUID. 13-ая цифра указывает, какой тип GUID у вас есть, поэтому он обычно не сильно отличается, а верхние два бита 17-й цифры всегда фиксируются на 01.

Для каждого типа GUID вы получите разные степени случайности. Версия 4 (13-я цифра = 4) является полностью случайной, за исключением цифр 13 и 17; версии 3 и 5 являются фактически случайными, поскольку они являются криптографическими хэшами; в то время как версии 1 и 2 в основном НЕ случайны, но определенные части довольно случайны в практических случаях. «Гоча» для идентификаторов GUID версии 1 и 2 заключается в том, что многие идентификаторы GUID могут поступать с одной и той же машины и в этом случае будут иметь большое количество идентичных битов (в частности, последние 48 битов и многие биты времени будут идентичны). , Или, если множество GUID было создано одновременно на разных машинах, вы можете столкнуться между битами времени. Так что, удачи в этом.

У меня была ситуация, когда мое программное обеспечение поддерживало только 64 бита для уникальных идентификаторов, поэтому я не мог напрямую использовать GUID. К счастью, все GUID были типа 4, поэтому я мог получить 64 бита, которые были случайными или почти случайными. У меня было два миллиона записей для хранения, и алгоритм дня рождения показал, что вероятность столкновения составляла 1,08420141198273 x 10 ^ -07 для 64 бит и 0,007 (0,7%) для 48 бит. Предполагается, что это лучший сценарий, поскольку уменьшение случайности обычно увеличивает вероятность столкновения.

Я полагаю, что теоретически в будущем может существовать больше типов GUID, чем определено сейчас, поэтому алгоритм усечения, ориентированный на будущее, невозможен.

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

Я согласен с Робом - Оставь все это .

Но так как вы сказали, что собираетесь войти в базу данных, я подумал, что хочу указать, что использование Guid не обязательно означает, что он будет хорошо индексироваться в базе данных. По этой причине разработчики NHibernate создали алгоритм Guid.Comb, который более дружественен к БД.

См. Генераторы POID NHibernate раскрыли и документацию по Алгоритмам Guid для получения дополнительной информации.

ПРИМЕЧАНИЕ: Guid.Comb предназначен для повышения производительности на MsSQL

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

Усечение GUID - плохая идея, см. в этой статье , почему.

Вам следует подумать о создании более короткого GUID, , так как Google показывает некоторые решения для ,Кажется, что эти решения включают в себя получение GUID и изменение его, чтобы он был представлен в виде полной 255-битной ascii.

...