Guid.NewGuid () กับ Guid ใหม่ ()


347

ความแตกต่างระหว่างGuid.NewGuid()และnew Guid()คืออะไร

เป็นที่หนึ่งที่ต้องการ?


6
@ClintonWard ฉันยังใหม่กับ C # และ @ Bob2Chiv ฉันไม่สามารถเรียกใช้โครงการได้ในตอนนี้และอยากรู้เกี่ยวกับมัน
OscarRyz

6
@OscarRyz - ให้ได้อย่างรวดเร็วการทดสอบรหัสใน C # ผมใช้LinqPad
DaveShaw

5
จริง ๆ แล้วฉันเชื่อว่าคำถามนี้เกี่ยวข้องเนื่องจากเป็นความสับสนและฉันไม่ได้จริงๆ "0000000-0000 .. " เป็นค่าเริ่มต้นที่ดีที่สุด ฉันพบปัญหาที่ลูกค้าไม่สามารถลงชื่อเข้าใช้ระบบได้เพราะมีบางคนที่อยู่ลึกเข้าไปในโครงการใหม่ Guid () ถูกเรียกแทน NewGuid ()
Michiel Cornille

3
@DaveShaw - LinQPad ยอดเยี่ยมมากและฉันใช้มันบ่อยมาก แต่ฉันอยากจะชี้ให้เห็นว่าตอนนี้ Visual Studio มีหน้าต่าง "C # Interactive" ซึ่งมีประโยชน์มากสำหรับการทดสอบประเภทนี้
Mark Meuer

1
@MichielCornille เพิ่งจะได้รู้ถึงความรู้สึกของพี่ชาย ...
Jins Peter

คำตอบ:


583

new Guid() ทำให้ "ว่าง" all-0 guid (00000000-0000-0000-0000-0000-000000000000 ไม่มีประโยชน์มาก)

Guid.NewGuid() สร้าง guid จริงด้วยค่าที่ไม่ซ้ำใครคุณอาจต้องการ


26
UUID ที่ว่างเปล่ามีประโยชน์มากจริงๆ มันทำให้ค่าพิเศษที่ดี
Jon Hanna

103
สังเกตด้านบน, เทียบเท่ากับnew Guid() Guid.Empty
Steve Guidi

30
@ Jonhanna ทุกคนให้คุณค่าที่ดีเยี่ยมเป็นพิเศษ น่าเสียดายที่คนที่ว่างเปล่ามีแนวโน้มที่จะชนกัน ฉันยอมรับว่า guids ที่ว่างเปล่านั้นมีประโยชน์แม้ว่าโดยทั่วไปแล้วจะระบุว่ามีบางอย่างที่ไม่ได้กำหนดค่าเริ่มต้น
MarkPflug

5
สิ่งที่ว่างเปล่ามีประโยชน์มากเพราะมันชนกัน ค่าพิเศษที่ไม่ได้ชนกับค่าพิเศษที่รู้จักจะไร้ประโยชน์
Jon Hanna

5
ฉันคิดว่าคุณทั้งคู่เห็นพ้องกันว่าจะทำให้ "รู้จัก guid" ดีเมื่อเทียบกับในกรณีของการระบุว่ากำลังรอการเริ่มต้นหรืออยู่ในสถานะที่รู้จัก โดยส่วนตัวแล้วฉันต้องการใช้ค่า Null แต่ฉันเห็นว่าบางคนอาจต้องการ guid ที่ "พิเศษ" ในบางจุดและ all-0 guid น่าจะเป็น guid ที่มีแนวโน้มน้อยที่จะละเมิดหลักการที่น่าประหลาดใจอย่างน้อยที่สุดสำหรับผู้ดูแลในอนาคต ของรหัส
PeterL

37

Guid.NewGuid() สร้าง UUID ใหม่โดยใช้อัลกอริทึมที่ออกแบบมาเพื่อทำให้การชนกันมากไม่น่าเป็นไปได้

new Guid() สร้าง UUID ที่เป็นศูนย์ทั้งหมด

โดยทั่วไปแล้วคุณจะชอบอดีตเพราะนั่นคือประเด็นของ UUID (เว้นแต่คุณจะได้รับจากที่อื่น)

มีหลายกรณีที่คุณต้องการ UUID ที่ไม่ต้องใช้ศูนย์ทั้งหมด แต่ในกรณีนี้Guid.Emptyหรือdefault(Guid)ชัดเจนเกี่ยวกับความตั้งใจของคุณและมีโอกาสน้อยที่คนที่อ่านมันคาดหวังว่าคุณค่าที่เป็นเอกลักษณ์จะถูกสร้างขึ้น

โดยรวมแล้วnew Guid()ไม่มีประโยชน์เนื่องจากการขาดความชัดเจน แต่เป็นไปไม่ได้ที่จะมีประเภทค่าที่ไม่มีตัวสร้างแบบไม่มีพารามิเตอร์ที่ส่งคืนค่า all-zeros-and-nulls

แก้ไข: จริง ๆ แล้วมันเป็นไปได้ที่จะมีตัวสร้างแบบไร้พารามิเตอร์ในประเภทค่าที่ไม่ได้ตั้งค่าทุกอย่างเป็นศูนย์และเป็นโมฆะ แต่คุณไม่สามารถทำได้ใน C # และกฎเกี่ยวกับเวลาที่มันจะถูกเรียกและเมื่อจะ การสร้างโครงสร้างแบบศูนย์ทั้งหมดนั้นสร้างความสับสนดังนั้นจึงไม่ใช่ความคิดที่ดี


16
ฉันจะเพิ่มมันเพื่อความสนุก สำหรับโอกาส 1% ของการชนคุณจะต้องสร้าง GUID ประมาณ 2,600,000,000,000,000,000 GUID
Clinton Ward

8
@ ClintonWard ขึ้นอยู่กับ UUID algorithm ใดที่ใช้อยู่ แต่เนื่องจากบางที่ใช้ MAC address เพื่อหลีกเลี่ยงการชนกันระหว่างเครื่องจักรและทั้งหมดใช้เวลาในการหลีกเลี่ยงการชนกันในเครื่องเดียวกันคุณต้องสร้างมากกว่าคณิตศาสตร์ปกติ อยากจะแนะนำ นอกจากว่าคุณจงใจใช้สกรูอัลกอริทึมด้วยการเปลี่ยนเวลาและยุ่งเหยิงกับที่อยู่ MAC ในกรณีนี้คุณควรจะได้อย่างรวดเร็ว - แต่จงใจที่จะยุ่งกับอินพุต
จอนฮันนา

2
นั่นคือ v1 Guid MS GUID ที่ใหม่กว่าเป็น 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 ที่ว่างเปล่า (คิดค่าศูนย์ทั้งหมด)

ผมคิดว่าพวกเขาจะต้องทำให้ประชาชนสร้างเป็นเป็นGuidstruct


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