Guid.NewGuid () против нового Guid ()

347

Какая разница между Guid.NewGuid()а new Guid()?

Какой из них предпочтительнее?

OscarRyz
источник
6
@ClintonWard Я практически новичок в C # и @ Bob2Chiv. Я не могу сейчас запустить проект, и мне было любопытно.
OscarRyz
6
@OscarRyz - для быстрого тестирования кода в C # я использую LinqPad .
DaveShaw
5
На самом деле я считаю, что этот вопрос актуален, потому что он сбивает с толку, и я не считаю «0000000-0000» лучшим выбором по умолчанию. Я просто столкнулся с проблемой, когда клиент не мог войти в систему, потому что где-то глубоко внутри проекта был вызван новый Guid () вместо NewGuid ()
Michiel Cornille
3
@DaveShaw - LinQPad великолепен, и я им часто пользуюсь. Но я хотел отметить, что в Visual Studio теперь есть окно «C # Interactive», которое очень полезно для такого рода тестов.
Марк Мейер
1
@MichielCornille Просто познакомился с чувством, брат ...
Джинс Питер

Ответы:

583

new Guid() делает "пустой" гид все-0 (00000000-0000-0000-0000-000000000000 не очень полезно).

Guid.NewGuid() делает реальный гид с уникальным значением, что вы, вероятно, хотите.

MarkPflug
источник
26
Пустой UUID действительно очень полезен. Это делает большую особую ценность.
Джон Ханна
103
На заметку, new Guid()эквивалентно Guid.Empty.
Стив Гуиди
30
@JonHanna Все гиды делают большие особые ценности. К сожалению, пустые имеют тенденцию сталкиваться. Я согласен, что пустые направляющие полезны, как правило, для указания того, что что-то неинициализировано.
MarkPflug
5
Пустые очень полезны, потому что они сталкиваются. Специальное значение, которое не сталкивалось с известным специальным значением, было бы бесполезным.
Джон Ханна
5
Я думаю, что вы оба согласны с тем, что это хороший «известный гид» для сравнения, как в случае указания, что что-то ожидает инициализации или находится в каком-то другом известном состоянии. Лично я предпочел бы использовать нулевое значение, но я вижу, что кому-то может понадобиться «специальный» guid в какой-то момент, и guid all-0, вероятно, является гидом, который с меньшей вероятностью нарушит принцип наименьшего удивления для будущих сопровождающих. кода.
PeterL
37

Guid.NewGuid() создает новый UUID, используя алгоритм, который разработан, чтобы сделать коллизии очень, очень маловероятными.

new Guid() создает UUID со всеми нулями.

Как правило, вы бы предпочли первое, потому что это точка UUID (если, конечно, вы не получаете его откуда-то еще).

Существуют случаи, когда вам действительно нужен UUID с нулевым значением, но в этом случае Guid.Emptyили default(Guid)вы лучше понимаете свои намерения, и есть меньше шансов, что кто-то прочитает его, ожидая, что было создано уникальное значение.

В целом, new Guid()это не так полезно из-за отсутствия ясности, но невозможно иметь тип значения, у которого нет конструктора без параметров, который возвращает значение «все нули и нули».

Изменить: На самом деле, возможно иметь конструктор без параметров для типа значения, который не устанавливает все на ноль и ноль, но вы не можете сделать это в C #, и правила о том, когда он будет вызван и когда будет просто быть созданной полностью нулевой структурой сбивает с толку, так что в любом случае это не очень хорошая идея.

Джон Ханна
источник
16
Я добавлю это для удовольствия. Для вероятности столкновения в 1% вам необходимо сгенерировать около 2 600 000 000 000 000 000 GUID
Клинтон Уорд
8
@ClintonWard это зависит от того, какой из алгоритмов UUID используется, но поскольку некоторые используют MAC-адреса, чтобы избежать коллизий между компьютерами, и все используют временной фактор, чтобы избежать коллизий на одной и той же машине, вам нужно создать даже больше, чем обычная математика. предложил бы. Если только вы не намеренно ввернули алгоритм, изменив время и связавшись с MAC-адресами, в этом случае вы должны получить его довольно быстро - но это намеренно портит входные данные.
Джон Ханна
2
Это был v1 Guid. более новые идентификаторы GUID MS являются V4 и не используют MAC-адрес как часть генерации GUID. Время все еще является фактором, хотя
Клинтон Уорд
16

[Я понимаю, что это старая ветка, просто добавим некоторые подробности] Два ответа Марка и Джона Ханны суммируют различия, хотя некоторые могут заинтересовать

Guid.NewGuid()

В конце концов вызывает CoCreateGuid (COM-вызов Ole32) (ссылка здесь ), и фактическая работа выполняется UuidCreate .

Guid.Empty предназначен для проверки того, содержит ли Guid все нули. Это также можно сделать путем сравнения значения рассматриваемого Guid с новым Guid ().

Итак, если вам нужен уникальный идентификатор , ответ будет Guid.NewGuid ()

Судханшу Мишра
источник
-2

Guid.NewGuid(), поскольку он создает GUID, как и предполагалось.

Guid.NewGuid()создает пустой Guidобъект, инициализирует его путем вызова CoCreateGuidи возвращает объект.

new Guid() просто создает пустой GUID (я думаю, все нули).

Я предполагаю, что они должны были сделать конструктор публичным как Guidесть struct.

Sharath
источник
5
Какой смысл добавлять ответ, который не добавляет ничего, чего еще нет в ответах, которые были здесь годами?
Dinerdo