Guid.NewGuid()がGuid.Emptyであるかどうかを確認する価値さえありますか?


28

私が取り組んでいるプロジェクトの1つでは、次のパターンがかなり定期的に見られます。

var guid = Guid.NewGuid().ToString();
while (guid == Guid.Empty.ToString())
{
    guid = Guid.NewGuid().ToString();
}

GUIDは一意であることが保証されておらず、MSDNのドキュメントによると、生成されたGUIDはゼロである可能性があることを理解していますが、これは実際に計算上の意味と開発者の時間の観点からサイクルテストを送信する価値がある実用的な考慮事項ですか? ?


1
このパターンが繰り返し表示される場合は、おそらく実用的な方法が適切でしょうか?このようなコードチャンクの繰り返しは、発生しないエッジケースをチェックするという事実よりも大きな問題のように思われます。
psr

27
そのコードは、ワニを遠ざけるためにあります。コードを書くワニはいますか?いや?その後、明らかに動作します!
エリックリッパー

3
いずれにせよ、私はこれを暫定的に行います。
アルトゥーロトーレスサンチェス

3
いったいなぜGUIDを文字列に変換してから比較するのですか?彼らは自分でうまく比較します。
アンディ

2
ドキュメントが更新されていた:「返さGUIDは等しくないGuid.Emptyに保証されています。」
sschoof

回答:


33

Guid.Emptyを確認する価値はないことをお勧めします。何らかの理由でGuid.NewGuidのドキュメントに言及している

新しいGuidの値がすべてゼロになるか、他のGuidと等しくなる可能性は非常に低くなります。

Guid.NewGuidはWin32 API CoCreateGuidのラッパーであり、すべてゼロを返すことについて言及していません。

レイモンド・チェンはさらに進んで

CoCreateGuidの有効な実装はGUID_NULLを生成できません

だから、いや、私はそれについて心配しないだろう。Guid.NewGuidのドキュメントで言及されている理由については推測できません。


1
「そして、何らかの理由でGUID_NULLを生成したとしても、一意性は1回だけである必要があります!(したがって、テストでこのバグを強制的に発生させて、実稼働では発生しないことを確信できます。 ) "-いいね!
razethestray

3
@razethestray-あなたは私のカジノであなたが望むすべてを賭けることができます。
ジェフ

10
@JeffOジョーク、彼は自宅で37回スピンすることを確認し、出てこなかったものにすべてのお金をかけるつもりです。
Random832

xamarinで、Guid.NewGuidが時々失敗し、常に空を返します(efコアでguidが自動的に割り当てられる場合)理由を理解できませんでした
Karan Harsh Wardhan

@KaranHarshWardhanバグとして報告してほしい。:)
カートニコルズ

43

Guid.NewGuid() == Guid.Empty地球上で最も難しい宝くじに当選したことがわかった場合。一意性や衝突チェックを気にしないでください。それをする必要がないのがガイドの目的です。私はあなたに数学をspareしまない、それはウェブ上のどこにでもある。

また、Windows GUIDには常に1つの「数字」があり4ます。GUIDにはいくつかの構造があります。

あなたが投稿したコードスニペットは、ある開発者がGuid変数を初期化するのを忘れており、変数であることがわかりましたGuid.Empty。彼は誤っGuid.NewGuid()て原因として特定しました。今、彼は永遠にこれを信じています。

いずれにせよ、これは尋ねるべき間違った質問です。あなたのコードは描画することだけでなくGuid.Empty、一意性にも依存していると確信しています。そのwhileループは一意性を強制しません。ガイドは、調整せずに独自の価値を生み出すためにあります。それが彼らのユースケースです。


5
「尋ねる質問が間違っています」に+1。それはすべて一意性についてであり、それが本当に重要なことです。
トーマスストリンガー

1
@rjziiはこれを受け入れられた答えにすることを検討します!
emcor

18

メソッドソースコードをGuid.NewGuid見てください:

public static Guid NewGuid() {
    Contract.Ensures(Contract.Result<Guid>() != Guid.Empty);
    ...
}

コード契約をご覧ください?このGuid.NewGuidメソッドは、空のGUIDを決して与えません。


2
他の回答に欠けているものについて言及しているので、なぜダウン票を受け取ったのかわかりません。コードコントラクトの存在はかなり良い保証であり、元の質問に対する優れた回答も提供します。実際の実装を確認するというアイデアについては、+ 1。
アルセニムルゼンコ

コードコントラクトが大好きです。
アンディ

10

GUIDをゼロのGUIDに対してチェックする場合、同じロジックで、アプリケーション内の他のすべてのGUIDに対してそれをチェックするために十分な注意を払う必要があります(ゼロになる確率は、アプリ内の他のGUIDを取得*)。このGUIDが一意であることを証明するためにこれを行う必要があります(実際には、テスト対0と同じ公理です)。

明らかにこれを行うことはばかげています。

TLDR; NewGuid()を信頼して一意の結果を生成できる場合、既知の単一のGUIDを生成しないことも信頼できます。

*実際には、.NET GUIDと常に同じ確率ではない{________-____-4___-____-____________}ため、NewGuidはゼロGUIDを生成しません。

楽しみのために、ここでドキュメントの改善を提案しました:http : //feedback.msdn.com/forums/257782-msdn-feature-suggestions/suggestions/7143498-fix-documentation-for-newguid


3
.NET GUIDに常に4が含まれるのはなぜですか?
アルトゥーロトーレスサンチェス

9
@ArturoTorresSánchez:あなたの質問への答えとGUIDに関するより多くの楽しい事実については、ここから始まる私の一連の記事を参照してください。ericlippert.com/2012/04/24/guid-guide-part-one Lukeが既にパート3にリンクしていることに注意してください。短い答え:バージョン4つのGUID常に4.含める
エリックリペット

@EricLippertその非常に良い記事:)
愛されていません彼らの人々
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.