Нужно ли проверять уникальность GUID? - PullRequest
10 голосов
/ 26 августа 2011

Я видел эту функцию в источнике, написанном моим коллегой

private String GetNewAvailableId()
{
    String newId = Guid.NewGuid().ToString();

    while (clientsById.ContainsKey(newId))
    {
        newId = Guid.NewGuid().ToString();
    }

    return newId;
}

Интересно, есть ли сценарий, в котором руководство может быть не уникальным?Код используется в многопоточном сценарии, а clientsById является словарем GUID и объектом

Ответы [ 4 ]

9 голосов
/ 26 августа 2011

Это должно быть совершенно ненужно - весь смысл GUID состоит в том, чтобы исключить необходимость таких проверок: -)

Вам может быть интересно прочитать этот интересный пост об алгоритмах генерации GUID:

Целью этого алгоритма является использованиекомбинация времени и местоположения («пространственно-временные координаты» для гиков относительности) в качестве ключа уникальности.Однако хронометраж не идеален, поэтому есть вероятность, что, например, два идентификатора GUID генерируются в быстрой последовательности из одной и той же машины, так близко друг к другу по времени, что временная метка будет одинаковой.Вот тут и вступает уникальность. Когда кажется, что время остановилось (если два запроса на GUID выполняются в быстрой последовательности) или пошло в обратном направлении (если системное время установлено на новое время раньше, чем было), уникализаторувеличивается, чтобы идентификаторы GUID, сгенерированные со «второго раза, когда было пять часов», не сталкивались с теми, которые были сгенерированы «первый раз, когда было пять часов».

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

3 голосов
/ 26 августа 2011

По определению, GUID являются уникальными (глобально уникальный идентификатор).Нет необходимости проверять уникальность, поскольку уникальность является целью GUID.

Общее количество уникальных ключей составляет 2 128 или 3,4 × 10 38 .Это число настолько велико, что вероятность того, что одно и то же число будет случайно сгенерировано дважды, ничтожно мала.

Цитата взята из Википедия

2 голосов
/ 26 августа 2011

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

С MSDN :

GUID - это 128-разрядное целое число (16 байт), которое можно использовать на всех компьютерах и в сетях, где требуется уникальный идентификатор.Такой идентификатор имеет очень низкую вероятность дублирования.

И, опять же, от MSDN :

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

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

1 голос
/ 26 августа 2011

Количество уникальных GUID.Если вы действительно хотите, можете поставить этот чек, но я не понимаю, почему с этими шансами.

Number of GUIDs 340,282,366,920,938,463,463,374,607,431,770,000,000 *
...