Если бы 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, чем определено сейчас, поэтому алгоритм усечения, ориентированный на будущее, невозможен.