มันคุ้มค่าที่จะตรวจสอบเพื่อดูว่า Guid.NewGuid () เป็น Guid.Empty หรือไม่


28

ในหนึ่งในโครงการที่ฉันทำงานในรูปแบบต่อไปนี้จะเห็นเป็นประจำค่อนข้าง:

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

ในขณะที่ฉันเข้าใจว่า AA GUID ไม่ได้รับประกันว่าจะไม่ซ้ำกันและตามเอกสาร MSDN GUID ที่สร้างขึ้นอาจเป็นศูนย์นี่เป็นข้อพิจารณาเชิงปฏิบัติที่คุ้มค่าที่จะส่งการทดสอบวงจรสำหรับทั้งในแง่ของการคำนวณและในแง่ของเวลาของนักพัฒนา ?


1
หากคุณเห็นรูปแบบนี้ซ้ำ ๆ อาจเป็นไปได้ว่าวิธีการยูทิลิตี้อยู่ในลำดับ การทำซ้ำโค้ดเช่นนี้ดูเหมือนว่าจะเป็นปัญหาใหญ่กว่าความจริงที่ว่าคุณกำลังตรวจสอบกรณีขอบที่จะไม่เกิดขึ้นและอาจไม่สำคัญแม้ว่ามันจะเกิดขึ้น
psr

27
รหัสนั้นอยู่ที่นั่นเพื่อให้จระเข้อยู่ห่าง มี alligators ที่คุณเขียนรหัสหรือไม่ ไม่มี? เห็นได้ชัดว่ามันใช้งานได้!
Eric Lippert

3
ไม่ว่าในกรณีใดฉันจะทำสิ่งนี้ในระหว่างทำ
Arturo Torres Sánchez

3
เหตุใดคุณจึงแปลง guids เป็นสายอักขระแล้วจึงเปรียบเทียบ พวกเขาเปรียบเทียบได้ด้วยตัวเอง
Andy

2
เอกสารได้รับการปรับปรุง: "การกลับ Guid มีการประกันเพื่อ Guid.Empty ไม่เท่ากัน."
sschoof

คำตอบ:


33

ฉันขอแนะนำว่ามันไม่คุ้มค่าที่จะตรวจสอบ Guid.Empty เอกสารสำหรับGuid.NewGuidด้วยเหตุผลบางอย่างที่กล่าวถึง

โอกาสที่ค่าของ Guid ใหม่จะเป็นศูนย์ทั้งหมดหรือเท่ากับ Guid อื่นใดที่ต่ำมาก

Guid.NewGuid เป็น wrapper สำหรับ Win32 API CoCreateGuidซึ่งไม่ได้กล่าวถึงการคืนค่าศูนย์ทั้งหมด

เรย์มอนด์เฉินเดินหน้าต่อไปโดยบอกว่า

ไม่มีการใช้งานที่ถูกต้องของ CoCreateGuid สามารถสร้าง GUID_NULL

ดังนั้นไม่ฉันไม่ต้องกังวลกับมัน ฉันจะไม่เดาว่าทำไม Guid.NewGuid docs ถึงพูดถึงมัน


1
"และแม้ว่ามันจะสร้าง GUID_NULL ด้วยเหตุผลบางอย่างความเป็นเอกลักษณ์ก็ต้องการให้มันทำเพียงครั้งเดียว! (ดังนั้นคุณควรพยายามบังคับให้ข้อผิดพลาดนี้เกิดขึ้นในการทดสอบแล้วคุณจึงมั่นใจได้ว่ามันจะไม่เกิดขึ้นในการผลิต ) "- เยี่ยม!
razethestray

3
@razethestray - คุณสามารถเดิมพันทั้งหมดที่คุณต้องการที่คาสิโนของฉัน
JeffO

10
@JeffO ล้อเล่นกับคุณเขาทำให้แน่ใจว่าจะหมุน 37 ครั้งที่บ้านและจะนำเงินทั้งหมดของเขาไปที่สิ่งที่ไม่ได้เกิดขึ้น
Random832

บน xamarin, Guid.NewGuid ล้มเหลวบางครั้งและคืนค่าว่างตลอดเวลา (เมื่อ guid ถูกกำหนดโดยอัตโนมัติใน ef core) ไม่สามารถหาสาเหตุได้
Karan Harsh Wardhan

@ KaranHarshWardhan ฉันหวังว่าคุณจะรายงานว่าเป็นข้อผิดพลาด :)
Curt Nichols

43

หากคุณพบว่าGuid.NewGuid() == Guid.Emptyคุณชนะลอตเตอรีที่ยากที่สุดในโลก ไม่ต้องกังวลกับการตรวจสอบเอกลักษณ์หรือการชนกันของข้อมูล ไม่ต้องทำนั่นคือสิ่งที่ guids มีสำหรับ ฉันจะให้คุณคณิตศาสตร์มันทุกที่บนเว็บ

นอกจากนี้ guid ของของ Windows มักจะมีหนึ่ง "หลัก" 4เท่ากับ มีโครงสร้างของ guids

ข้อมูลโค้ดคุณโพสต์รูปลักษณ์เช่นเดียว dev ลืมที่จะเริ่มต้นตัวแปรและพบว่ามันจะGuid Guid.Emptyเขาระบุผิดพลาดว่าGuid.NewGuid()เป็นสาเหตุ ตอนนี้เขาจะเชื่อเรื่องนี้อย่างเชื่อโชคลางตลอดไป

ในกรณีใด ๆ นี่เป็นคำถามที่ผิดที่จะถาม ฉันแน่ใจว่ารหัสของคุณไม่เพียง แต่ขึ้นอยู่กับว่าไม่เคยวาดGuid.Emptyแต่ยังขึ้นอยู่กับเอกลักษณ์ การwhileวนซ้ำนั้นไม่ได้บังคับใช้ความเป็นเอกลักษณ์ Guids อยู่ที่นั่นเพื่อสร้างคุณค่าที่ไม่เหมือนใครโดยไม่มีการประสานงาน นั่นคือกรณีการใช้งานของพวกเขา


5
+1 ถึง "คำถามผิดที่จะถาม" มันคือทั้งหมดที่เกี่ยวกับเอกลักษณ์นั่นคือทั้งหมดที่สำคัญจริงๆ
Thomas Stringer

1
@rjzii พิจารณาทำให้คำตอบนี้ได้รับการยอมรับ!
emcor

18

ดูรหัสที่มาของGuid.NewGuidวิธีการ :

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

ดูสัญญารหัส? Guid.NewGuidวิธีการไม่ให้ GUID ที่ว่างเปล่า


2
ไม่แน่ใจว่าทำไมคุณถึงได้รับการโหวตเพราะมันพูดถึงบางสิ่งที่ขาดหายไปในคำตอบอื่น ๆ การปรากฏตัวของสัญญารหัสเป็นการรับประกันที่ดีและยังให้คำตอบที่ดีสำหรับคำถามเดิม +1 สำหรับแนวคิดในการดูการใช้งานจริง
Arseni Mourzenko

ฉันรักสัญญารหัส
Andy

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 เสมอ
Arturo Torres Sánchez

9
@ ArturoTorresSánchez: สำหรับคำตอบสำหรับคำถามของคุณและข้อเท็จจริงที่สนุกสนานมากมายเกี่ยวกับ GUID โปรดดูชุดบทความของฉันที่เริ่มต้นที่นี่ ericlippert.com/2012/04/24/guid-guide-part-one ฉันทราบว่าลุคเชื่อมโยงกับส่วนที่สามแล้วเพื่อความสะดวกของคุณ คำตอบสั้น ๆ : GUID เวอร์ชัน 4 ประกอบด้วย 4 เสมอ
Eric Lippert

@EricLippert เป็นบทความที่ดีมาก :)
ไม่รักไม่ใช่คนของพวกเขา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.