ปลอดภัยหรือไม่ที่จะถือว่า GUID ไม่ซ้ำกันเสมอไป


123

ฉันรู้ว่ามีความเป็นไปได้เพียงไม่กี่นาทีที่จะเกิดการปะทะกัน แต่ถ้าฉันสร้างชุด GUID จำนวน 1,000 ชุด (เช่น) จะปลอดภัยหรือไม่ที่จะถือว่าพวกเขาไม่ซ้ำกันเพื่อบันทึกการทดสอบแต่ละรายการ

คำถามโบนัส

วิธีที่ดีที่สุดในการทดสอบ GUID เพื่อความเป็นเอกลักษณ์? กรองบลูมอาจจะ?


2
เป็นไปได้ที่จะทำซ้ำGUID ไม่ซ้ำกัน 100% ของเวลาหรือไม่
ChrisF

29
ไม่ใช่ถ้าเราทุกคนยังคงบดขยี้ปุ่มรีโหลดบนเว็บไซต์นี้: wasteaguid.info
mipadi

12
ฉันตำหนิข้อบกพร่องทั้งหมดของฉันเกี่ยวกับการชนกันของ GUID มันต้องเกิดขึ้นบ้างแล้วใช่ไหม?
Michael

8
มีความเป็นไปได้สูงมากที่ฉลามที่มีสีลายสก็อตน่ารักจะตกลงมาจากท้องฟ้าและทุบคอมพิวเตอร์ของคุณเป็นชิ้นเล็กชิ้นน้อยดังนั้นฉันจึงขอเสนอว่าการใช้มาตรการป้องกันนั้นเป็นการจัดสรรทรัพยากรที่เหมาะสมกว่าเพื่อเป็นส่วนหนึ่งของการลดความเสี่ยงโดยรวมของคุณ วางแผน.
David Gladfelter

4
@mipadi: ลิงค์เยี่ยม! ฉันสามารถนึกภาพนักพัฒนาบางคนที่ส่งเสียงครวญครางว่า "Guuuuys! หยุดเสีย GUIDs! ฉันต้องการสิ่งนั้น!"
FrustratedWithFormsDesigner

คำตอบ:


360

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

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

มีGUID จำนวนมหาศาลอยู่ที่นั่น หากต้องการอ้างอิงคู่มือการผูกมัดของดักลาสอดัมส์สู่กาแล็กซี่ :

"อวกาศ" มันบอก "ใหญ่มากใหญ่จริง ๆ คุณจะไม่เชื่อเลยว่ามันใหญ่โตเหลือเชื่อขนาดไหนฉันหมายความว่าคุณอาจคิดว่ามันเป็นเส้นทางที่ยาวไกลไปถึงนักเคมี แต่นั่นเป็นเพียงแค่ถั่วลิสงสู่อวกาศเท่านั้น , ฟัง…”

และเนื่องจากมีดาวประมาณ 7 × 10 22ดวงในจักรวาลและต่ำกว่า 2 128 GUIDs จึงมีประมาณ 4.86 × 10 15 - เกือบห้าพันล้าน --GUID สำหรับดาวทุกดวง หากดาวเหล่านั้นทุกดวงมีโลกที่มีประชากรที่เฟื่องฟูเช่นเดียวกับเราแล้วรอบ ๆ ดวงดาวทุกดวงมนุษย์หรือมนุษย์ต่างดาวทุกคนที่เคยอาศัยอยู่จะมีสิทธิได้รับ GUID กว่าสี่หมื่นห้าพันรายการ สำหรับทุกคนในประวัติศาสตร์ที่ดวงดาวทุกดวงในจักรวาล พื้นที่ GUID อยู่ในระดับเดียวกับขนาดของจักรวาลทั้งหมด คุณไม่จำเป็นต้องกังวล

( แก้ไข 2:สะท้อนสิ่งนี้: ว้าวฉันไม่รู้ตัวเองว่านี่หมายถึงอะไรพื้นที่ GUID มีขนาดใหญ่อย่างไม่สามารถเข้าใจได้ฉันรู้สึกกลัวมัน)


1
นอกจากนี้ WolframAlpha รายงานว่าสำหรับทุกเซลล์ในทุก ๆ คนที่เคยมีชีวิตอยู่มี UUID ถึง 36 ล้านล้าน UUID คุณมี10^14เซลล์ในร่างกายประมาณ 106.5 พันล้านคนเคยอาศัยอยู่ หรือ2.385 * 10^23UUID สำหรับหนี้สาธารณะของสหรัฐฯทุกเปอร์เซ็นต์
new123456

5
แม้ว่าตัวเลขจะยังคงสูง แต่โอกาสที่ GUID จะชนกันนั้นมีมากกว่า 50% ที่ 2 ^ 64 GUID
NullUserException

1
ที่ 2 ^ 64 GUID สิ่งนี้จะลดจำนวนลงให้เหลือน้อยกว่าหนึ่ง (0.00026) ต่อดาวในจักรวาลและ 2 * 10 ^ (- 15) สำหรับมนุษย์หรือมนุษย์ต่างดาวทุกคนที่เคยมีชีวิตอยู่ สิ่งนี้ยังคงอนุญาตให้มี GUID มากกว่า 170 ล้านรายการสำหรับมนุษย์ทุกคนที่เคยมีชีวิตอยู่ดังนั้นฉันคิดว่าเรายังสบายดี
NullUserException

12
ที่น่าสังเกตว่าการชนกันของ GUID เป็นปัญหาหากอยู่ในพื้นที่ธุรกิจเดียวกัน GUID ที่ฉันใช้เพื่อระบุส่วนประกอบในซอฟต์แวร์อาจเหมือนกับ GUID ที่คุณใช้ในแถวฐานข้อมูลในแอปพลิเคชันของคุณเองโดยไม่ก่อให้เกิดปัญหาใด ๆ
James Thorpe

1
ความจริงที่ว่ามี GUIDS 2 ^ 128 ไม่เกี่ยวข้องและคุณไม่ "ยังดี" ที่มีโอกาสปะทะกัน 50% คุณยังไม่ดีที่ 0.0000001%
BlackTigerX

40

คำตอบสั้น ๆ : เพื่อวัตถุประสงค์ในทางปฏิบัติใช่

อย่างไรก็ตามคุณต้องพิจารณาความขัดแย้งในวันเกิด!

ฉันได้คำนวณความน่าจะเป็นของการชนกันของตัวแทนบางส่วน ด้วย UUID 122 บิตตามที่ระบุไว้ในบทความ Wikipediaความน่าจะเป็นของการชนกันคือ 1/2 หากคุณสร้าง2.71492e18UUID อย่างน้อย ด้วย 10 ^ 19 UUIDs ความน่าจะเป็นคือ 0.999918 ด้วย 10 ^ 17 UUIDs, 0.000939953

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

หากคุณสร้าง 1 พันล้าน UUID ต่อวินาทีจะใช้เวลาประมาณ 36 ปีเพื่อให้มีโอกาสเกิดการชนกัน 10%

ในที่สุดอาจมีการปะทะกันระหว่างชุดของ UUID ที่สร้างขึ้นในช่วงประวัติศาสตร์ของมนุษย์ อย่างไรก็ตามความน่าจะเป็นที่ UUID จะถูกใช้เพื่อจุดประสงค์เดียวกันนั้นมีน้อยมากดังนั้นจึงไม่มีปัญหาในทางปฏิบัติ


13
นี่คือจุดสิ้นสุดของจักรวาล ... โปรแกรมเมอร์บางคนคิดว่า GUID ของพวกเขาจะไม่ซ้ำกันสำหรับดาวมรณะขนาดใหญ่ของพวกเขาเสมอ ...
pkr298

เนื่องจาก UUID นั้นขึ้นอยู่กับข้อมูลที่ไม่ใช่แบบสุ่ม 36 ปีจึงเป็น - คุณจะต้องกังวลกับแต่ละมิลลิวินาทีทีละรายการ
mjaggard

@mjaggard UUIDs ขึ้นอยู่กับข้อมูลแบบสุ่ม การเรียงลำดับที่ทันสมัยอย่างไรก็ตาม
Trejkaz

8

การวิเคราะห์ความเป็นไปได้ของการชนมีอยู่ใน Wikipedia: http://en.wikipedia.org/wiki/Uuid#Random_UUID_probability_of_duplicates

ตามที่ระบุไว้ในลิงก์นี้จะได้รับผลกระทบจากคุณสมบัติของตัวสร้างตัวเลขสุ่ม

นอกจากนี้ยังมีความเป็นไปได้ที่จะเกิดข้อผิดพลาดในรหัสตัวสร้าง GUID แม้ว่าโอกาสจะต่ำ แต่ก็น่าจะสูงกว่าโอกาสที่จะเกิดการชนกันตามหลักคณิตศาสตร์

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


5

โดยทั่วไปถือว่าปลอดภัย

หากตัวสร้าง GUID ของคุณเป็นแบบสุ่มอย่างแท้จริงความเป็นไปได้ของการปะทะภายใน 1,000 GUID จะน้อยมาก

แน่นอนว่าถือว่าเป็นเครื่องกำเนิด GUID ที่ดี ดังนั้นคำถามก็คือคุณเชื่อถือเครื่องมือที่คุณใช้สร้าง GUID มากแค่ไหนและมีการทดสอบของตัวเองหรือไม่?


0

แม้ว่าจะเกิดการชนกัน แต่ก็ไม่น่าเป็นไปได้อย่างมาก (คณิตศาสตร์ที่นี่ ) มันปลอดภัยที่จะถือว่าพวกเขาแตกต่างกันในความเป็นจริง


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