GUID ไม่ซ้ำกัน 100% หรือไม่


519

GUID ไม่ซ้ำกัน 100% หรือไม่

มันจะไม่ซ้ำกันในหลายกระทู้หรือไม่?


264
ไม่มีไม่ได้ 100% ... เพียงแค่ 99,999999999999999999999999999999999999999999999999999999999999999999999999999%;)
JohannesH

52
ประการแรก GUID ไม่ใช่อนันต์ซึ่งหมายความว่าสำหรับความหมายตามตัวอักษรของ "100% ของเวลา" จะหมายความว่าไม่ว่าคุณจะสร้าง GUID นานเท่าใดก็ตามพวกเขาจะไม่ซ้ำกันเสมอ กรณีนี้ไม่ได้. นอกจากนี้เนื่องจากการใช้งานแบบเดิมที่การ์ดเครือข่ายอนุกรม / id / MAC ที่ไม่ซ้ำกันถูกนำมาใช้เพื่อผลิตส่วนหนึ่งของคีย์นั้นไม่ได้ใช้อีกต่อไปด้วยเหตุผลหลายประการ GUID จึงไม่ซ้ำกันทั่วโลกอีกต่อไป มันเป็นอย่างไรที่ไม่ซ้ำกันในประเทศ กล่าวอีกนัยหนึ่งถ้าคุณสร้าง GUID บนเครื่องเดียวคุณจะไม่ได้รับซ้ำ
Lasse V. Karlsen

36
@ojrac ฉันแค่เลือกที่จะปัดเศษ ... : P
JohannesH

403
ทุกครั้งที่ฉันสร้าง GUID ฉันรู้สึกว่าฉันขโมยมาจากจักรวาล บางครั้งฉันคิดเกี่ยวกับคนชั่วร้ายที่สร้าง GUID มากกว่าที่พวกเขาต้องการและคนที่เสีย GUID นั้นไม่เหงาหรือถูกใช้ซ้ำอีกครั้ง ...
asavartsov

29
@asavartsov ฉันคิดว่าคุณจะชอบwasteaguid.info ^ _ ^
Navin

คำตอบ:


431

ในขณะที่แต่ละ GUID ที่สร้างขึ้นไม่ได้รับประกันว่าจะไม่ซ้ำกันจำนวนรวมของคีย์ที่ไม่ซ้ำกัน (2 128หรือ 3.4 × 10 38 ) มีขนาดใหญ่มากจนความน่าจะเป็นของหมายเลขเดียวกันที่สร้างขึ้นสองครั้งนั้นเล็กมาก ตัวอย่างเช่นลองพิจารณาเอกภพที่สังเกตได้ซึ่งมีดาวประมาณ 5 × 10 22 ดวง; จากนั้นดาวทุกดวงจะมีGUID ที่เป็นเอกลักษณ์ในระดับสากล6.8 × 10 15

จากวิกิพีเดีย


เหล่านี้เป็นบทความที่ดีเกี่ยวกับวิธีการสร้าง GUID (สำหรับ. NET) และวิธีที่คุณจะได้รับ guid เดียวกันในสถานการณ์ที่ถูกต้อง

https://ericlippert.com/2012/04/24/guid-guide-part-one/

https://ericlippert.com/2012/04/30/guid-guide-part-two/

https://ericlippert.com/2012/05/07/guid-guide-part-three/

​​


115
พวกเขาจะไม่ถูกเรียกว่า UUID ใช่ไหม ;)
Arafangion

28
GUID เป็นการใช้งานตามมาตรฐาน UUID ของไมโครซอฟท์ ดังนั้นมันทั้งคู่ ID ที่ไม่ซ้ำกันทั่วโลกและ ID ที่ไม่ซ้ำแบบสากล
Adam Davis

40
ในทางเทคนิคแล้วมันไม่ใช่ 2 ^ 128 เพราะใน v4 GUID คุณมีเลขฐานสิบหกหลักที่จะเป็น 4 เสมอ (ลบ 4 บิตได้อย่างมีประสิทธิภาพ) และสงวนสองบิตเพิ่มเติมไว้ อย่างไรก็ตาม VID GUID ที่ถูกต้อง 2 ^ 122 ยังคงเหลืออยู่ประมาณ 5x10 ^ 36 ซึ่งจะทำเพื่อฉัน และสำหรับคุณด้วย ดาวแต่ละดวงจะต้องยอมรับเพียง 1.1x10 ^ 14 GUIDs แต่ละอัน
Andrew Shelansky

67
หากคุณชอบฉันแล้วคุณจะต้องการที่จะรู้ว่าเขียนออกมาจะอยู่ที่ประมาณ:2^128 34,028,236,692,093,846,346,337,460,743,177,000,000ในทางสถิติหากคุณคำนวณ 1,000 GUID ทุกวินาทีมันยังคงใช้เวลาหลายล้านล้านปีในการได้รับซ้ำ
นิติบุคคล

26
ฉันแค่คิดว่ามันตลกที่จะอ่านมันออกมาที่นี่มีคนสนุก ๆ :) สามสิบสี่สิบสองล้านแปดสิบสองล้านหกแสนหกล้านหกแสนเก้าสองแปดเก้าสิบสองแปดสิบเก้าสิบสามแปดแปดสิบสี่หกหกเจ็ดล้านสี่แสนหกล้านสามแสนเจ็ด สี่ร้อยหกสิบล้านล้านเจ็ดร้อยสี่สิบสามพันหนึ่งร้อยเจ็ดสิบเจ็ดล้าน
hjavaher

85

หากคุณกลัวค่า GUID เดียวกันให้ใส่สองค่าไว้ข้างๆกัน

Guid.NewGuid().ToString() + Guid.NewGuid().ToString();

หากคุณหวาดระแวงเกินไปให้ใส่สามตัว


64
คุณจะต้องเป็นคนหวาดระแวงมากมากต่อท้าย 3 GUID
harsimranb

25
@harsimranb No... very, very, very, very paranoid is 6 GUIDs. Paranoid is one appended, very paranoid is two appended, etc.
Suamere

37
@Suamere ฉันได้สร้างเว็บไซต์สำหรับการคำนวณระดับหวาดระแวงของคุณjogge.github.io/HowParanoidAmI
Jogge

3
@Jogge xD มันวิเศษมากฮ่า ๆ หลังจาก 9 9 999999999ในรูปแบบของคุณฉันคิดว่า Paranoia จะ a-splode Browser ของฉัน
Suamere

66

คำตอบง่ายๆคือใช่

เรย์มอนด์เฉินเขียนบทความยอดเยี่ยมเกี่ยวกับ GUID และเหตุใดจึงไม่รับประกันถึงความเป็นเอกลักษณ์ของ guidings บทความไปในเชิงลึกเกี่ยวกับวิธีการสร้าง GUID และข้อมูลที่ใช้เพื่อให้แน่ใจว่ามีเอกลักษณ์ซึ่งควรมีความยาวพอสมควรในการอธิบายว่าทำไมพวกเขาถึง :-)


23
ฉันคิดว่าบทความของเฉินอ้างถึง V1 ของอัลกอริทึมการสร้าง GUID ซึ่งใช้ที่อยู่ MAC และการประทับเวลา - V4 ปัจจุบันใช้หมายเลขหลอกแบบสุ่มแทน: en.wikipedia.org/wiki/Globally_Unique_Identifier#
Barrett

2
การเชื่อมโยงจะตาย - 403 พระราชวังต้องห้าม
Daya


39

ในฐานะที่เป็นบันทึกย่อฉันได้เล่นกับ Volume GUID ใน Windows XP นี่เป็นเลย์เอาต์ของพาร์ติชั่นที่คลุมเครือมากด้วยสามดิสก์และสิบสี่โวลุ่ม

\\?\Volume{23005604-eb1b-11de-85ba-806d6172696f}\ (F:)
\\?\Volume{23005605-eb1b-11de-85ba-806d6172696f}\ (G:)
\\?\Volume{23005606-eb1b-11de-85ba-806d6172696f}\ (H:)
\\?\Volume{23005607-eb1b-11de-85ba-806d6172696f}\ (J:)
\\?\Volume{23005608-eb1b-11de-85ba-806d6172696f}\ (D:)
\\?\Volume{23005609-eb1b-11de-85ba-806d6172696f}\ (P:)
\\?\Volume{2300560b-eb1b-11de-85ba-806d6172696f}\ (K:)
\\?\Volume{2300560c-eb1b-11de-85ba-806d6172696f}\ (L:)
\\?\Volume{2300560d-eb1b-11de-85ba-806d6172696f}\ (M:)
\\?\Volume{2300560e-eb1b-11de-85ba-806d6172696f}\ (N:)
\\?\Volume{2300560f-eb1b-11de-85ba-806d6172696f}\ (O:)
\\?\Volume{23005610-eb1b-11de-85ba-806d6172696f}\ (E:)
\\?\Volume{23005611-eb1b-11de-85ba-806d6172696f}\ (R:)
                                     | | | | |
                                     | | | | +-- 6f = o
                                     | | | +---- 69 = i
                                     | | +------ 72 = r
                                     | +-------- 61 = a
                                     +---------- 6d = m

ไม่ใช่ว่า GUID นั้นจะคล้ายกันมาก แต่ความจริงที่ว่า GUID ทั้งหมดนั้นมีสตริง "mario" อยู่ในตัว นั่นเป็นเรื่องบังเอิญหรือมีคำอธิบายเบื้องหลังเรื่องนี้หรือไม่?

ตอนนี้เมื่อgoogling สำหรับส่วนที่ 4ใน GUID ฉันพบประมาณ 125.000 hits ที่มี GUID ระดับเสียง

สรุป:เมื่อพูดถึง Volume GUID พวกเขาจะไม่ซ้ำกับ GUID อื่น ๆ


31
จำได้ไหมว่าโฆษณา Super Mario Bros 3 จากยุค 80? ทุกคนตะโกนว่า "มาริโอ! มาริโอ! มาริโอ!" รอบโลกทำให้เกิดการสุ่มของจักรวาลเล็กน้อย
MGOwen

24
หากคุณถอนการติดตั้ง Office 2010 ด้วยmsiexecตนเองโปรแกรมดังกล่าวจะแสดงรายการโปรแกรม MSI GUID ทั้งหมดของโปรแกรม Office 0FF1CEพวกเขาสะกดทุก ดูเหมือนว่า Microsoft จะมีความเป็นธรรม ... หลวม ... การตีความวิธีสร้าง GUID;)
Mark Henderson

3
GUID ของพาร์ติชันเหล่านี้ถูกสร้างขึ้นพร้อมกันในเวลา 2009-12-17 @ 2:47:45 PM UTC สิ่งเหล่านี้ไม่ซ้ำกับเครื่องของคุณ แต่วาง "มาริโอ" เป็นตัวระบุโหนดไม่ถูกต้อง - นั่นหมายความว่าพวกเขาไม่สอดคล้องกับ RFC-4122 เช่นเดียวกัน0FF1CEGUID จะอยู่ภายใต้หัวข้อ "ความเข้ากันได้ของ NCS ย้อนหลัง" ของ RFC-4122 แต่ก็ไม่น่าเป็นไปได้ที่ Microsoft จะปฏิบัติตามกฎ NCS สำหรับค่าเหล่านั้น
สตีเฟ่นเคลียร์

16
ฉันรู้แล้วว่าการรักษาความปลอดภัยของ Nintendo ได้ทำลายเครื่องกำเนิดตัวเลขแบบสุ่ม
MetaGuru

1
บางทีมันอาจจะเป็นสวนบอลแห่งเดียวกันกับชื่อของ บริษัท ที่ผลิตน้ำแร่ การสะกดคำย้อนหลังให้ความไร้เดียงสา :-)
Mariusz

31

มันไม่ควรเกิดขึ้น อย่างไรก็ตามเมื่อ. NET อยู่ภายใต้การโหลดจำนวนมากเป็นไปได้ที่จะได้รับ guids ที่ซ้ำกัน ฉันมีเว็บเซิร์ฟเวอร์สองแห่งโดยใช้เซิร์ฟเวอร์ sql สองแห่ง ฉันไปรวมข้อมูลและพบว่าฉันมี 15 ล้าน guids และ 7 รายการที่ซ้ำกัน


1
วิธีนี้เป็นไปได้ในสองเครื่องที่แตกต่างกันอย่างไร ฉันคิดว่า GUID เป็นชื่อเครื่องหรือไม่ (ไม่ใช่การโต้เถียง ... แค่ถาม)
John Cruz

8
นี่จะเป็นจริงสำหรับ v1 guids ที่ใช้ที่อยู่ MAC (ไม่ใช่ชื่อเครื่อง) เป็นส่วนหนึ่งของการสร้าง GUID v4 ซึ่งเป็นพฤตินัย STD ไม่ได้ใช้ที่อยู่ Mac แต่เป็นหมายเลขสุ่มหลอก
Xander

14
Guid.NewGuidสร้าง v4 GUID เสมอ (และมีเสมอ) ทิมต้องมีแหล่งข้อมูลเอนโทรปีที่แย่มาก
สตีเฟ่นเคลียร์

1
นั่นเคยมีการจำลองแบบหรือไม่? นั่นเป็นปัญหาใหญ่หากเป็นเช่นนั้น
Zyo

1
เหมือนกันที่นี่ในขณะที่นำเข้าชุดข้อมูลที่มีขนาดใหญ่มาก จากประมาณ 10-100 ล้านคุณจะได้รับข้อมูลซ้ำจาก Guid.NewGuid
Stephan Baltzer

28

ใช่ GUID ควรไม่ซ้ำกันเสมอ มันขึ้นอยู่กับฮาร์ดแวร์และเวลารวมทั้งบิตพิเศษเล็กน้อยเพื่อให้แน่ใจว่ามันไม่ซ้ำกัน ฉันแน่ใจว่ามันเป็นไปได้ในทางทฤษฎีที่จะจบลงด้วยสองสิ่งที่เหมือนกัน แต่ไม่น่าเป็นไปได้มากในสถานการณ์โลกแห่งความเป็นจริง

นี่เป็นบทความที่ยอดเยี่ยมโดย Raymond Chen เกี่ยวกับ Guids:

https://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx


5
บทความนี้ค่อนข้างเก่าและอ้างถึง v1 ของ GUID v4 ไม่ได้ใช้ฮาร์ดแวร์ / เวลา แต่เป็นอัลกอริทึมตัวเลขสุ่มแทน en.wikipedia.org/wiki/Globally_unique_identifier#Algorithm
Mani Gandham

ลิงก์นี้ใช้งานไม่ได้
Marcel


23

Guids มีเอกลักษณ์ทางสถิติ อัตราต่อรองของลูกค้าที่แตกต่างกันสองรายที่สร้าง Guid เดียวกันนั้นมีขนาดเล็กมาก (สมมติว่าไม่มีข้อบกพร่องในรหัสการสร้าง Guid) คุณอาจกังวลเกี่ยวกับตัวประมวลผลที่ผิดพลาดเนื่องจากรังสีคอสมิคและตัดสินใจว่าวันนี้ 2 + 2 = 5

หลายเธรดที่จัดสรร guids ใหม่จะได้รับค่าที่ไม่ซ้ำกัน แต่คุณควรทราบว่าฟังก์ชั่นที่คุณเรียกนั้นปลอดภัยสำหรับเธรด สภาพแวดล้อมแบบนี้มีอะไรบ้าง?


19

Eric Lippert ได้เขียนบทความเกี่ยวกับ GUID ที่น่าสนใจมาก

มีคอมพิวเตอร์ส่วนบุคคลที่มีการสั่งซื้อ 2 30เครื่องในโลก (และแน่นอนว่ามีอุปกรณ์พกพาหรืออุปกรณ์คอมพิวเตอร์ที่ไม่ใช่พีซีซึ่งมีกำลังการคำนวณในระดับเดียวกันหรือมากกว่า แต่ให้เพิกเฉยต่อสิ่งเหล่านี้) สมมติว่าเราให้พีซีเหล่านั้นทั้งหมดในโลกเป็นงานสร้าง GUID หากแต่ละคนสามารถสร้างพูดได้ 2 20 GUID ต่อวินาทีหลังจากนั้นเพียงประมาณ 2 72วินาที - หนึ่งร้อยห้าสิบล้านล้านปี - คุณจะมีโอกาสสูงมากในการสร้างการชนกับ GUID เฉพาะของคุณ และอัตราต่อรองของการชนจะค่อนข้างดีหลังจากผ่านไปเพียงสามสิบล้านล้านปี


28
... และเขายังคงดำเนินต่อไปในย่อหน้าถัดไป: "แต่นั่นก็คือการมองหาการปะทะกันกับ GUID ที่เฉพาะเจาะจง [... ] ดังนั้นถ้าเราให้พีซีพันล้านเครื่องเหล่านั้นทำงานสร้าง GUID แบบ 122 บิตของความน่าจะเป็น สองในที่นั้นจะเกิดการชนกันสูงขึ้นหลังจากสร้าง ^ 2 ประมาณ 61 GUID เนื่องจากเราสมมติว่าประมาณ 2 ^ 30 เครื่องกำลังทำ 2 ^ 20 GUID ต่อวินาทีเราคาดหวังว่าจะเกิดการชนหลังจากนั้นประมาณ 2 ^ 11 วินาทีซึ่งประมาณหนึ่งชั่วโมง " (และในที่สุดเขาก็อธิบายว่าแน่นอนไม่ใช่ว่ามีการสร้าง GUID จำนวนมาก)
Arjan

16

ในทางทฤษฎีไม่มีพวกเขาไม่ได้เป็นเอกลักษณ์ เป็นไปได้ที่จะสร้าง guid ที่เหมือนกันซ้ำ ๆ อย่างไรก็ตามโอกาสที่จะเกิดขึ้นนั้นต่ำมากจนคุณคิดว่ามันไม่เหมือนใคร

ฉันได้อ่านมาก่อนแล้วว่าโอกาสที่จะเหลือน้อยมากที่คุณควรเน้นเรื่องอื่น - เช่นเซิร์ฟเวอร์ของคุณซึ่งติดไฟได้เองหรือข้อบกพร่องอื่น ๆ ในรหัสของคุณ นั่นคือสมมติว่ามันไม่ซ้ำกันและไม่สร้างในรหัสใด ๆ ที่จะ "จับ" ซ้ำกัน - ใช้เวลาของคุณกับสิ่งที่น่าจะเกิดขึ้น (เช่นสิ่งอื่น)

ฉันพยายามอธิบายถึงประโยชน์ของ GUID ให้กับผู้ชมบล็อกของฉัน (ผู้ที่ไม่ใช่สมาชิกในครอบครัว) จากที่นั่น (ผ่านทาง Wikipedia) โอกาสในการสร้าง GUID ที่ซ้ำกัน:

  • 1 ใน 2 ^ 128
  • 1 ใน 340 ล้านดอลลาร์ (ไม่ต้องกังวลเงินล้านไม่ได้ตอบคำถาม)
  • 1 ใน 3.4 × 10 ^ 38
  • 1 ใน 340,000,000,000,000,000,000,000,000,000,000,000,000,000,000

1
ที่จริงแล้วฉันไม่เห็นด้วยกับ 'ไม่ต้องกังวลกับมัน' ถึงแม้ว่าจะมีท่าทางที่แตกต่างออกไป: หากคุณตรวจจับการปะทะ GUID แล้วมีบางอย่างผิดปกติกับแอปพลิเคชันของคุณ ฉันเคยใช้ GUID เช่น idempotency และมีการชนกันเมื่อมีการส่งคำสั่งสองครั้ง (ด้วย GUID เดียวกัน)
Kenny Hung

9

ดูเหมือนจะไม่มีใครพูดถึงคณิตศาสตร์ที่แท้จริงของความน่าจะเป็นที่เกิดขึ้น

ก่อนอื่นสมมติว่าเราสามารถใช้พื้นที่ 128 บิตทั้งหมดได้ (Guid v4 ใช้เพียง 122 บิต)

เรารู้ว่าความน่าจะเป็นโดยทั่วไปของการไม่คัดลอกซ้ำnคือ:

(1-1 / 2 128 ) (1-2 / 2 128 ) ... (1- (n-1) / 2 128 )

เนื่องจาก 2 128มีขนาดใหญ่กว่าnมากเราจึงสามารถประมาณสิ่งนี้กับ:

(1-1 / 2 128 ) n (n-1) / 2

และเนื่องจากเราสามารถสันนิษฐานได้ว่าnมีขนาดใหญ่กว่า 0 เราจึงสามารถประมาณได้ว่า:

(1-1 / 2 128 ) n ^ 2/2

ทีนี้เราสามารถเทียบมันกับความน่าจะเป็น "ยอมรับได้" สมมติว่า 1%:

(1-1 / 2 128 ) n ^ 2/2 = 0.01

ซึ่งเราแก้ปัญหาnและรับ:

n = sqrt (2 * บันทึก 0.01 / บันทึก (1-1 / 2 128 ))

ซึ่ง Wolfram Alpha ได้รับเป็น5.598318 × 10 19

ในการใส่ตัวเลขลงในมุมมองลองใช้เครื่อง 10,000 เครื่องแต่ละเครื่องมีซีพียู 4 คอร์ทำ 4Ghz และใช้รอบ 10000 เพื่อสร้าง Guid และไม่ทำอะไรเลย จากนั้นจะใช้เวลา ~ 111 ปีก่อนที่จะสร้างสำเนา


ฉันได้แก้ไขโพสต์ของคุณที่ติดตามโพสต์นี้ - โปรดแก้ไขถ้าฉันทำผิด;)
shA.t

สวัสดี @Cine ฉันมีอำนาจที่จะแก้ไขคำตอบของคุณ แต่เลือกที่จะไม่ทำเพราะฉันต้องการได้รับโอกาสให้คุณโต้แย้งมันก่อนฉันอาจจะมาในเดือนหนึ่งเพื่อเปลี่ยนอย่างเป็นทางการถ้าฉันไม่ได้ ' ไม่ได้ยินจากคุณ ฉันค่อนข้างแน่ใจว่าคณิตศาสตร์ของคุณผิด สมการที่แท้จริงสำหรับการพิจารณาโอกาส 1% คือ: ((2 ^ 128 - 1) / 2 ^ 128) ^ ((n (n-1)) / 2) = .01 เลขชี้กำลังของคุณผิด มันไม่ใช่แค่ n คุณต้องการ C (n, 2) (aka (n * (n-1)) / 2) เพื่อคำนวณชุดค่าผสมทั้งหมดเมื่อคุณสร้าง guids "n" ดูที่นี่สำหรับข้อมูลเพิ่มเติม
viggity

ขอบคุณ Cine ฉันก็ลงเอยด้วยการประมาณ n ^
2/2

จะใช้เวลา 10,000 เครื่อง 111 ปีในการสร้าง GUID ที่เป็นไปได้ทุกครั้งจากนั้นสร้างซ้ำ ซ้ำกันจะเกิดขึ้นนานก่อนที่จะสร้าง GUID ที่เป็นไปได้ทั้งหมด ฉันคิดว่ากรอบเวลาโดยประมาณจะขึ้นอยู่กับว่า 'การสุ่ม' กระบวนการสร้าง GUID เป็นอย่างไร
George K

@ GeorgeK ฉันคิดว่าคุณเข้าใจผิด ... มันต้องใช้เวลา 10,000 เครื่อง 111 ปีจึงจะมีโอกาส 1% ที่จะได้พบกับสิ่งที่ซ้ำกัน แต่ใช่วิชาคณิตศาสตร์นี้ถือว่าเครื่องกำเนิดแบบสุ่มนั้นสุ่มทั้งหมด
ภาพยนตร์

7

จากhttp://www.guidgenerator.com/online-guid-generator.aspx

GUID คืออะไร

GUID (หรือ UUID) เป็นตัวย่อของ 'Globally Unique Identifier' (หรือ 'Universally Unique Identifier') เป็นตัวเลขจำนวนเต็ม 128 บิตที่ใช้เพื่อระบุทรัพยากร โดยทั่วไปแล้วคำว่า GUID จะถูกใช้โดยนักพัฒนาที่ทำงานกับเทคโนโลยีของ Microsoft ในขณะที่ UUID จะถูกใช้ในที่อื่น

GUID มีความโดดเด่นอย่างไร

128- บิตมีขนาดใหญ่พอและอัลกอริธึมการสร้างนั้นไม่ซ้ำกันมากว่าถ้า 1,000,000,000 GUIDs ต่อวินาทีถูกสร้างขึ้นเป็นเวลา 1 ปีความน่าจะเป็นของการทำซ้ำจะมีเพียง 50% หรือถ้ามนุษย์ทุกคนบนโลกสร้าง 600,000,000 GUIDs น่าจะเป็น 50% ของความซ้ำซ้อน


7
มีโอกาส 50% ที่จะทำสำเนาสูงพอที่จะทำให้เกิดความกลัวใช่หรือไม่
disklosr

1
@disklosr ใช่แล้วมันก็เพียงพอที่จะทำให้เกิดความหวาดกลัวถ้าระบบของคุณสร้าง 1 พันล้าน GUID ต่อวินาที ในกรณีที่ไม่น่าเป็นไปได้อย่างยิ่งที่คุณสร้างจำนวนนั้นเพียงแค่โยงสอง GUID เข้าด้วยกัน ...
maxshuty

5

ฉันพบ GUID ที่ซ้ำกัน

ฉันใช้เครื่องสแกนเดสก์ท็อป Neat Receipts และมาพร้อมกับซอฟต์แวร์ฐานข้อมูลที่เป็นกรรมสิทธิ์ ซอฟต์แวร์มีคุณสมบัติการซิงค์กับคลาวด์และฉันยังคงได้รับข้อผิดพลาดเมื่อทำการซิงค์ ห่านตัวผู้ที่ท่อนซุงเผยให้เห็นสายที่ยอดเยี่ยม

"ข้อผิดพลาด": [{"รหัส": 1, "ข้อความ": "creator_guid: มีอยู่แล้ว", "guid": "C83E5734-D77A-4B09-B8C1-9623CAC7B167"}]

ฉันค่อนข้างจะไม่เชื่อ แต่ก็พอแล้วเมื่อฉันพบวิธีในฐานข้อมูลเรียบร้อยแล้วลบระเบียนที่มี GUID นั้นข้อผิดพลาดก็หยุดลง

ดังนั้นเพื่อตอบคำถามของคุณพร้อมหลักฐานพอสมควรไม่มี ซ้ำกันเป็นไปได้ แต่มันอาจเป็นไปได้ว่าเหตุผลที่มันเกิดขึ้นนั้นไม่ได้เกิดจากโอกาส แต่เนื่องจากการฝึกแบบมาตรฐานนั้นไม่ได้ยึดถือในทางใดทางหนึ่ง (ฉันไม่ใช่คนโชคดี) แต่ฉันก็ไม่สามารถพูดได้อย่างแน่นอน ไม่ใช่ซอฟต์แวร์ของฉัน

ฝ่ายบริการลูกค้าของพวกเขานั้นสุภาพและให้ความช่วยเหลืออย่างมาก แต่พวกเขาต้องไม่เคยเจอปัญหานี้มาก่อนเพราะหลังจากผ่านโทรศัพท์ 3 ชั่วโมงไปกับพวกเขาพวกเขาไม่พบวิธีแก้ปัญหา (FWIW ฉันประทับใจมากกับ Neat และความผิดพลาดนี้ แต่น่าผิดหวังไม่เปลี่ยนความคิดเห็นของฉันเกี่ยวกับผลิตภัณฑ์ของพวกเขา)


19
อย่าเชื่อว่าคุณมีสิ่งที่ซ้ำกัน อาจมีสิ่งอื่นที่เกี่ยวข้องเช่นหมายเลขไม่สุ่มอย่างแท้จริงหรือมีปัญหาในกระบวนการซิงค์หรือระบบพยายามบันทึกสองครั้ง ฯลฯ ปัญหาซอฟต์แวร์มีแนวโน้มมากกว่าที่คุณได้รับ GUID ซ้ำ
orad


4

หากนาฬิการะบบของคุณตั้งไว้อย่างถูกต้องและไม่ได้พันไว้และหาก NIC ของคุณมี MAC ของตัวเอง (เช่นคุณยังไม่ได้ตั้งค่า MAC ที่กำหนดเอง) และผู้ขาย NIC ของคุณยังไม่ได้รีไซเคิล MAC (ซึ่งไม่ควรทำ แต่สิ่งที่ทราบกันดีว่าเกิดขึ้น) และหากมีการใช้ฟังก์ชั่นการสร้าง GUID ของระบบอย่างถูกต้องระบบของคุณจะไม่สร้าง GUID ที่ซ้ำกัน

หากทุกคนในโลกที่สร้าง GUID ปฏิบัติตามกฎเหล่านั้น GUID ของคุณจะไม่ซ้ำกันทั่วโลก

ในทางปฏิบัติจำนวนคนที่ฝ่าฝืนกฎต่ำและ GUID ของพวกเขาไม่น่าจะ "หลบหนี" ความขัดแย้งนั้นไม่น่าจะเป็นไปได้ทางสถิติ


11
นี่จะเป็นจริงสำหรับ v1 guids v4 ซึ่งเป็นพฤตินัย STD ไม่ได้ใช้ที่อยู่ Mac แต่เป็นหมายเลขสุ่มหลอก
Pita.O

1
"จากนั้นระบบของคุณจะไม่สร้าง GUID ที่ซ้ำกัน" แม้ว่าจะมีการปฏิบัติตามกฎทั้งหมดสำหรับ v1 guid ตามที่คุณพูดว่าระบบของคุณยังสามารถสร้างรายการซ้ำได้ คุณถูกต้องมากขึ้นที่ด้านล่างเมื่อคุณระบุว่า "ความขัดแย้งเป็นไปไม่ได้ทางสถิติ"
Nick Meldrum

3

GUID ไม่ซ้ำกัน 100% หรือไม่

ไม่รับประกันเนื่องจากมีหลายวิธีในการสร้างหนึ่ง อย่างไรก็ตามคุณสามารถลองคำนวณโอกาสในการสร้างสอง guid ของที่เหมือนกันและคุณได้รับความคิด: GUID ที่มี 128 บิตจึงมี 2 128 guid ของที่แตกต่างกัน - มากมากกว่ามีดาวในจักรวาลที่รู้จักกัน อ่านบทความวิกิพีเดียสำหรับรายละเอียดเพิ่มเติม


2

โดยทั่วไปแล้วสิ่งนี้เรียกว่า "ปัญหาวันเกิด" หรือ "วันเกิดความขัดแย้ง" Wikipedia มีภาพรวมที่ดีงามที่: Wikipedia - ปัญหาวันเกิด

ในแง่คร่าวๆรากที่สองของขนาดของพูลเป็นการประมาณคร่าวๆของเมื่อคุณสามารถคาดหวังโอกาส 50% ของการซ้ำ บทความนี้มีตารางความน่าจะเป็นของขนาดพูลและความน่าจะเป็นต่าง ๆ รวมทั้งแถว 2 ^ 128 ดังนั้นสำหรับความน่าจะเป็นที่ 1% ของการชนคุณคาดว่าจะสุ่มเลือกตัวเลขขนาด 128 * 10 ^ 18 แบบสุ่ม 2.6 * 10 ^ 18 โอกาส 50% ต้องเลือก 2.2 * 10 ^ 19 ในขณะที่ SQRT (2 ^ 128) คือ 1.8 * 10 ^ 19

แน่นอนว่าเป็นกรณีที่เหมาะสำหรับกระบวนการสุ่มอย่างแท้จริง ดังที่คนอื่น ๆ พูดกันบ่อยครั้งที่มีการสุ่มเลือกสิ่งนั้น- เครื่องกำเนิดและเมล็ดพันธุ์ดีแค่ไหน? มันจะดีถ้ามีการสนับสนุนฮาร์ดแวร์บางอย่างเพื่อช่วยในกระบวนการนี้ซึ่งจะเป็นหลักฐานแสดงหัวข้อย่อยเพิ่มเติมยกเว้นว่าสิ่งใดที่สามารถปลอมแปลงหรือเสมือนจริง ฉันสงสัยว่าอาจเป็นสาเหตุว่าทำไมที่อยู่ MAC / การประทับเวลาจะไม่ถูกรวมอีกต่อไป


ฉันคิดว่าปัญหาของ MAC นั้นคือการไม่เปิดเผยตัวตน ฉันเชื่อว่าการใช้ตัวระบุเช่นที่อยู่ MAC ในลักษณะที่สามารถย้อนกลับได้นั้นเป็นข้อกังวลด้านความเป็นส่วนตัว ฉันเชื่อว่าการสุ่มตัวอย่างในฮาร์ดแวร์เป็นเรื่องยากมาก? Cloudflare ใช้กล้องและโคมไฟลาวาเป็นแถวอย่างไรก็ตามฉันคิดว่าด้วยความเข้าใจฟิสิกส์อย่างแม่นยำแม้จะไม่ใช่แบบสุ่มก็ตาม โคมไฟลาวา Cloudflares RNG: popularmechanics.com/technology/security/news/a28921/…
Jeff Block

2

เพื่อผลลัพธ์ที่ดียิ่งขึ้นวิธีที่ดีที่สุดคือการผนวก GUID ด้วยการประทับเวลา (เพื่อให้แน่ใจว่ายังคงมีความเป็นเอกลักษณ์)

Guid.NewGuid().ToString() + DateTime.Now.ToString();

ถ้าคุณได้รับการชนสองครั้งในวินาทีเดียวกัน
Wai Ha Lee

นั่นเป็นกรณีที่เลวร้ายที่สุด แต่ก็ยังเราไม่สามารถสร้าง Guid สองตัวได้ในเวลาเดียวกัน
Adithya Sai

ที่ไหนสักแห่งที่พวกเขาโต้แย้งว่าควรคัดลอกจากคำตอบใน SO ไม่ใช่คำถาม แต่ตอนนี้ฉันไม่แน่ใจ ....
Marcel

1

อัลกอริธึม GUID มักจะนำไปใช้ตามข้อกำหนดของ v4 GUID ซึ่งโดยทั่วไปแล้วจะเป็นสตริงแบบหลอกเทียม น่าเศร้าที่สิ่งเหล่านี้ตกอยู่ในหมวดหมู่ของ"แนวโน้มที่ไม่ซ้ำกัน"จาก Wikipedia (ฉันไม่รู้ว่าทำไมคนจำนวนมากถึงไม่สนใจบิตนี้): "... เวอร์ชัน GUID อื่นมีคุณสมบัติที่เป็นเอกลักษณ์และความน่าจะเป็นที่แตกต่างกัน มีแนวโน้มที่จะไม่มีลักษณะเฉพาะ "

คุณสมบัติการสุ่มหลอกของ JavaScript ของ V8 Math.random()คือ TERRIBLE ที่มีเอกลักษณ์และการชนมักเกิดขึ้นหลังจากการทำซ้ำเพียงไม่กี่พันครั้ง แต่ V8 ไม่ได้เป็นผู้ร้ายเพียงคนเดียว ฉันเคยเห็นการชน GUID ในโลกแห่งความจริงโดยใช้ทั้ง PHP และ Ruby การใช้งาน v4 GUID

เนื่องจากเป็นเรื่องปกติมากขึ้นที่จะขยายการสร้าง ID ในไคลเอนต์หลายรายและกลุ่มของเซิร์ฟเวอร์เอนโทรปีจึงได้รับความนิยมอย่างมาก - โอกาสของการสุ่มเมล็ดเดียวกันที่ใช้ในการสร้างการเพิ่ม ID (เวลามักใช้เป็นเมล็ดสุ่ม) ในเครื่องกำเนิดไฟฟ้าแบบหลอกหลอก) และการชน GUID เพิ่มขึ้นจาก "มีแนวโน้มว่าจะไม่ซ้ำกัน" เป็น "น่าจะทำให้เกิดปัญหามากมาย"

เพื่อแก้ปัญหานี้ฉันตั้งค่าเพื่อสร้างอัลกอริทึม ID ที่สามารถปรับขนาดได้อย่างปลอดภัยและรับประกันการชนที่ดีขึ้น ทำได้โดยใช้การประทับเวลาตัวนับไคลเอนต์ในหน่วยความจำลายนิ้วมือไคลเอนต์และอักขระแบบสุ่ม การรวมกันของปัจจัยสร้างความซับซ้อนที่เพิ่มขึ้นซึ่งทนต่อการชนโดยเฉพาะอย่างยิ่งแม้ว่าคุณจะขยายสเกลข้ามโฮสต์จำนวนมาก:

http://usecuid.org/


1

ฉันพบ GUID ที่ไม่ซ้ำกันระหว่างการทดสอบหน่วยแบบหลายเธรด / หลายกระบวนการ (ด้วยหรือไม่) ฉันเดาว่าเกี่ยวข้องกับทุกสิ่งอื่น ๆ ที่เท่าเทียมกันเมล็ดที่เหมือนกัน (หรือขาดการเพาะ) ของเครื่องกำเนิดไฟฟ้าแบบหลอกเทียม ฉันใช้มันเพื่อสร้างชื่อไฟล์ที่ไม่ซ้ำกัน ฉันพบว่าระบบปฏิบัติการดีกว่ามากในการทำเช่นนั้น :)

แจ้งเตือนการหมุนรอบ

คุณถามว่า GUID นั้นไม่ซ้ำกัน 100% หรือไม่ ขึ้นอยู่กับจำนวน GUID ที่จะต้องไม่ซ้ำกัน เมื่อจำนวน GUID เข้าใกล้อินฟินิตี้ความน่าจะเป็นสำหรับ GUID ที่ซ้ำกันจะเข้าใกล้ 100%


1

คำตอบของ"GUID นั้นไม่เหมือนใคร 100% หรือไม่" เป็นเพียง"ไม่"

  • หากคุณต้องการเอกลักษณ์ของ GUID 100% ให้ทำตาม

    1. สร้าง GUID
    2. ตรวจสอบว่า GUID นั้นมีอยู่ในคอลัมน์ตารางของคุณซึ่งคุณกำลังมองหาเอกลักษณ์อยู่หรือไม่
    3. ถ้ามีอยู่แล้วข้ามขั้นตอนที่ 1 ไปอีกขั้นตอนที่ 4
    4. ใช้ GUID นี้เป็นเอกลักษณ์

สิ่งนี้ไม่ได้ทำให้เป็นเอกลักษณ์ อัลกอริทึมของคุณไม่ได้บันทึก GUID ที่สร้างขึ้นใหม่ในตาราง ครั้งต่อไปที่คุณสร้าง GUID มันอาจจะเกิดการชนกันก่อน หากคุณต้องแทรก GUID ลงในตาราง GUID อาจถูกแทรกโดยเพียร์อื่นในระหว่างที่คุณตรวจสอบความไม่ซ้ำกันและคุณได้แทรก GUID ลงในตาราง GUID นั้นไม่ซ้ำกันภายในระบบของคุณดังนั้นหากคุณต้องการนำเข้าหรือรวมฐานข้อมูลสองฐานพวกเขายังสามารถชนกันได้ นอกจากนี้ GUID มักใช้เมื่อคุณไม่สามารถเข้าถึงฐานข้อมูลศูนย์กลางได้ หากคุณมีเหตุผลทำไมไม่เพียงดึง ID จากฐานข้อมูล
Jogge

0

ส่วนที่ยากที่สุดไม่ได้เกี่ยวกับการสร้าง Guid ที่ซ้ำกัน

ส่วนที่ยากที่สุดคือการออกแบบฐานข้อมูลเพื่อจัดเก็บสิ่งที่สร้างขึ้นทั้งหมดเพื่อตรวจสอบว่ามีการทำซ้ำจริงหรือไม่

จาก WIKI:

ตัวอย่างเช่นจำนวนของ UUID แบบสุ่มรุ่น 4 ที่จำเป็นต้องสร้างขึ้นเพื่อให้มีความน่าจะเป็น 50% ของการชนอย่างน้อยหนึ่งครั้งคือ 2.71 ล้านล้านคำนวณดังนี้

ป้อนคำอธิบายรูปภาพที่นี่

จำนวนนี้เทียบเท่ากับการสร้าง 1 พันล้าน UUID ต่อวินาทีเป็นเวลาประมาณ 85 ปีและไฟล์ที่มี UUIDs นี้จำนวน 16 ไบต์ต่อ UUID จะอยู่ที่ประมาณ 45 Exabytes ซึ่งใหญ่กว่าฐานข้อมูลที่ใหญ่ที่สุดที่มีอยู่ในปัจจุบันหลายเท่า คำสั่งของเพตาไบต์นับร้อย


0

GUID ย่อมาจาก Global Unique Identifier

โดยย่อ: (เบาะแสอยู่ในชื่อ)

รายละเอียด: GUID ได้รับการออกแบบให้ไม่ซ้ำใคร พวกเขาคำนวณโดยใช้วิธีการสุ่มตามนาฬิกาคอมพิวเตอร์และคอมพิวเตอร์เองหากคุณสร้าง GUID จำนวนมากที่มิลลิวินาทีเดียวกันบนเครื่องเดียวกันอาจเป็นไปได้ที่อาจตรงกัน แต่สำหรับการดำเนินงานปกติเกือบทั้งหมด

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