Может ли GUID совпасть?

336
03 июля 2017, 16:12

Хотя уникальность каждого отдельного GUID не гарантируется, общее количество уникальных ключей настолько велико (2128 или 3,4028×1038), что вероятность того, что в мире будут независимо сгенерированы два совпадающих ключа, крайне мала.

Как его изменить (модифицировать) чтобы он вообще никогда не мог совпасть?

Answer 1

Невозможно.

Дело в том, что GUID имеет фиксированную длину 128 бит. Всего разных 128-битных чисел ровно 2128. Допустим, вы смогли создать «идеальный» генератор GUID'ов. Запустите его на генерацию 2128 + 1 числа. Из них, понятно, какие-то два из них совпадут.

Для того, чтобы числа никогда не повторялись, они, как минимум, должны быть неограниченной битовой длины.

Answer 2

Уникальность обычно гарантируется двумя вещами, на выбор:

  1. Сравнением. Генерируете и проверяете, что такого ещё нет.
  2. Зависимостью от какой нибудь однозначной переменной, например время.

Понятно, что оба способа имеют свои проблемы, но они в целом решаемы, если вы конечно не математическое обоснование чего-то в дипломе пишете.

Answer 3

Если вопрос чисто теоретический, то невозможно.

Если практический, прибавьте к нему timestamp и уникальный id клиента (того, кто генерирует id, например id телефона или жесткого диска).

Для хранения второго числа можно использовать отдельное поле. Сравнивать разумеется надо сразу оба поля. Теоретически этим мы нарушим правило 128 бит в GUID, но практически мы застрахуемся, например, от неверного алгоритма получения случайных чисел и даже при супер больших данных не получим коллизии.

Насколько я помню в WinAPI при генерации итак учитывается timestamp и id устройства.

Впрочем, вероятность коллизии и с обычным GUID итак пренебрежительно мала.

(Ответ дополнен)

READ ALSO
Сильно тормозит Visual Studio(2017)

Сильно тормозит Visual Studio(2017)

При написании кода студия начинает сильно тормозить (1-2) секунды, потом отлагивает, и так все времяПроблема появилась пару дней назад

539
в C# запросить ввод в форму textbox

в C# запросить ввод в форму textbox

Как в C# запросить ввод в форму, если она пуста?

417
Label поверх Canvas с событиями

Label поверх Canvas с событиями

Имеется Canvas и на нём LabelНа канвасе и лейбле имеются события нажатия ЛКМ

254
HtmlAgilityPack и xNet

HtmlAgilityPack и xNet

Всем добра! Использую xNet библиотеку и HtmlAgilityPack

231