ยอมรับได้หรือไม่ที่จะพึ่งพา ints แบบสุ่ม?


42

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


47
ทำไมการใช้เลขจำนวนเต็มต่อเนื่องถึงไม่ตัดมัน?
whatsisname

20
ทำไมคุณไม่ใช้ int ที่เพิ่มขึ้นมาล่ะ? GUIDซึ่งออกแบบมาให้มีคุณสมบัติที่เป็นเอกลักษณ์ที่คุณอธิบายมีขนาด 128 บิตไม่ใช่ 32
Robert Harvey

21
อีกวิธีหนึ่งคือกำหนดหมายเลขช่องสัญญาณให้กับคอมพิวเตอร์ที่เชื่อมต่อแต่ละเครื่องและใช้รหัสลำดับที่เพิ่มขึ้น ตัวเลขสองตัวที่รวมกัน (ด้วยหมายเลขช่องสัญญาณที่รับบิตสูงตามลำดับ) จะกลายเป็นรหัสเฉพาะใหม่ของคุณ
Robert Harvey

27
หาก "ตัวสร้างหมายเลขสุ่ม" ของคุณรับประกันได้ว่าจะไม่มีการทำซ้ำหมายเลขใดหมายเลขหนึ่งจนกว่าจะมีการสร้างหมายเลขอื่นทั้งหมดมันเป็นตัวสร้างตัวเลขสุ่มที่แย่มาก! ด้วยตรรกะเดียวกันลำดับการทอยเหรียญแบบ "สุ่ม" ที่เป็นไปได้เท่านั้นคือ HTHTHTHTHT ....
alephzero

17
"ฉันต้องการแพ็คเก็ตที่มีตัวระบุที่ไม่ซ้ำกัน" ผลลัพธ์ของการละเมิดข้อกำหนดนี้คืออะไร หากคุณต้องการตัวระบุที่ไม่ซ้ำกันในการอ่านคำที่เข้มงวดที่สุดคุณจะต้องมีระบบรวมศูนย์ตัวบ่งชี้ที่แยกออกมา (เช่นวิธีการกำหนด MACs ให้กับ บริษัท การ์ดเครือข่ายแต่ละแห่ง) เป็นไปได้ว่าคุณมีคำจำกัดความ "เบา" ที่นุ่มนวลกว่า การเข้าใจระดับความนุ่มนวลนั้นจะเปลี่ยนคำตอบที่คุณได้รับเป็นอย่างมาก
Cort Ammon

คำตอบ:


142

ระวังความขัดแย้งวันเกิด

สมมติว่าคุณกำลังสร้างลำดับของค่าสุ่ม (เหมือนกันเป็นอิสระ) จากชุดขนาด N (N = 2 ^ 32 ในกรณีของคุณ)

จากนั้นกฎของหัวแม่มือสำหรับวันเกิดความขัดแย้งระบุว่าเมื่อคุณสร้างค่าเกี่ยวกับ sqrt (N) อย่างน้อยมีโอกาส 50% ที่เกิดการชนนั่นคือนั่นมีค่าที่เหมือนกันอย่างน้อยสองค่าใน สร้างลำดับ

สำหรับ N = 2 ^ 32, sqrt (N) = 2 ^ 16 = 65536 ดังนั้นหลังจากที่คุณสร้างตัวบ่งชี้ประมาณ 65k ก็มีแนวโน้มว่าทั้งสองจะชนกันมากกว่า! หากคุณสร้างตัวระบุต่อวินาทีสิ่งนี้จะเกิดขึ้นในเวลาน้อยกว่าหนึ่งวัน จำเป็นต้องพูดโปรโตคอลเครือข่ายจำนวนมากทำงานเร็วกว่านั้น


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

6
(คลิกที่นี่เพื่อแสดงผลทางคณิตศาสตร์)สำหรับสิ่งที่คุ้มค่าการประมาณ $ \ sqrt {N} $ นั้นแม่นยำจนถึงปัจจัยคงที่ สำหรับ $ N = 2 ^ {32} $ ขีด จำกัด ที่แท้จริงคือ 77164 เนื่องจากนี่เป็นค่าที่เล็กที่สุดของ $ n $ ซึ่ง $ \ prod_ {k = 1} ^ {n-1} (1 - k / N) <1 / 2. $
wchargin

4
@wchargin: ไม่มีอะไรน่าอัศจรรย์เกี่ยวกับความน่าจะเป็นที่กดปุ่ม 0.5 ได้ สิ่งที่น่าสังเกตก็คือความน่าจะเป็นที่เพิ่มขึ้นอย่างรวดเร็วเมื่อเพิ่ม N หากตัวระบุแบบ 32 บิตจะมีโอกาสเล็กน้อย แต่ไม่น่ารำคาญของการชนแบบสุ่มตัวระบุแบบ 40 บิตจะแทบไม่มีเลย
supercat

3
@supercat: นั่นคือทั้งหมดที่จริง ผมแค่คิดว่าถ้ามีใครให้ดังกล่าวอย่างต่อเนื่องหนึ่งเช่นกันอาจจะให้ค่าที่ถูกต้อง :-)
wchargin

2
@wchargin: ฉันชอบที่จะคิดในแง่ที่ว่าใครจะต้องเริ่มกังวลกับการซ้ำซ้อน หากมีค่าต่ำกว่า sqrt (N) ความน่าจะเป็นของการชนลดลงอย่างรวดเร็วจนถึงจุดที่สามารถบอกได้อย่างปลอดภัยว่าพวกเขาจะไม่เกิดขึ้นเว้นแต่จะมีข้อบกพร่องร้ายแรงในเครื่องกำเนิดไฟฟ้าแบบสุ่ม
supercat

12

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

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

ดังนั้นจึงมีมาตรฐานที่ใช้ 122 บิตเพียงพอที่จะสร้างรหัสสุ่มที่ไม่ซ้ำกัน แต่ 32 บิตไม่เพียงพอ ด้วยรหัส 32 บิตจะใช้เวลาประมาณ2¹⁶ ID เท่านั้นก่อนที่ความเสี่ยงของการชนจะสูงถึง 50% เพราะด้วย ID 2¹⁶จะมีค่าใกล้เคียงกับ2³¹คู่ซึ่งแต่ละรายการอาจมีการชนกัน

แม้แต่ 122 บิตก็น้อยกว่าที่ฉันอยากจะแนะนำในการออกแบบใหม่ ๆ หากทำตามมาตรฐานบางอย่างมีความสำคัญต่อคุณให้ใช้ UUID มิฉะนั้นใช้สิ่งที่มีขนาดใหญ่กว่า 122 บิต

ฟังก์ชันแฮช SHA1 ที่มีเอาต์พุต 160 บิตจะไม่ถือว่ามีความปลอดภัยอีกต่อไปซึ่งส่วนหนึ่งเป็นเพราะ 160 บิตไม่เพียงพอที่จะรับประกันความเป็นเอกลักษณ์ของเอาต์พุต ฟังก์ชันแฮชที่ทันสมัยมีเอาต์พุตจาก 224 ถึง 512 บิต รหัสสุ่มที่สร้างขึ้นควรมีขนาดเท่ากันเพื่อให้แน่ใจว่ามีความปลอดภัยที่ไม่เหมือนใคร


12
SHA-1 นั้นไม่ปลอดภัยเนื่องจากมีการโจมตีเฉพาะ (เช่นไม่ใช่แบบสุ่ม) กับอัลกอริธึมเองที่สามารถค้นหาการชนได้เร็วกว่าแรงเดรัจฉานไม่ใช่เพราะมีโอกาสสูงในการชนแบบสุ่ม การประมาณคร่าวๆบอกว่าด้วย 122 บิตและอัตราการสร้าง 1 พันล้าน (10 ^ 9) IDs ต่อวินาทีมันจะใช้เวลามากกว่า 73 ปีก่อนที่จะถึงโอกาส 50% ของการชนกัน
8bittree

sqrt(2^122)= 2.3 ล้านล้าน quadrillion UUIDs
noɥʇʎԀʎzɐɹƆ

2
@ 8bittree เครือข่าย bitcoin คำนวณ2⁷⁰ SHA2 แฮชทุก 10 นาที หากว่านั่นคือ SHA1 hashes จะใช้เวลาเพียงหนึ่งสัปดาห์ในการสร้างการชน หากมีการสร้าง UUID ที่ความเร็วเดียวกับที่ bitcoin คำนวณแฮชมันจะใช้เวลาน้อยกว่า 2 วินาทีในการชนกัน
kasperd

Bitcoin คือทั้งหมดที่เกี่ยวกับการพยายามค้นหาการชนและเป็นที่นิยมอย่างมากและมีฮาร์ดแวร์เฉพาะที่ออกแบบมาโดยเฉพาะสำหรับการค้นหาแฮช ตอนนี้แน่นอนว่าถ้า OP กำลังวางแผนที่จะสร้าง cryptocurrency ยอดนิยมหรือสิ่งที่คล้ายกันพวกเขาอาจต้องการบิตหลายร้อยหรือหลายพันบิตต่อ ID แต่ทันทีที่สมมติว่าสิ่งเหล่านั้นเป็นข้อกำหนดอาจกระตุ้นให้ทำงานได้มากกว่าที่จำเป็นถ้าไลบรารี UUID มาตรฐานนั้นเพียงพอ
8bittree

@ 8bittree หากใช้ไลบรารี่มาตรฐานเป็นข้อได้เปรียบจากนั้นลองไปหา UUID แต่การดึงไบต์แบบสุ่มบางส่วนออกไปurandomนั้นใช้งานไม่ได้มากกว่าการใช้ไลบรารี UUID ฉันเพิ่งนำทั้งสองไปใช้ใน Python เพื่อเปรียบเทียบและแต่ละวิธีมีรหัสแหล่งที่มา 25 ตัวอักษร
kasperd

3

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

parseToInt(toString(System.currentTimeMillis()) + toString(Random.makeInt()))

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


9
1ms อาจใช้เวลานานในบางระบบ
quant_dev

7
สิ่งนี้ไม่ได้ลดโอกาสการชนเลย ความน่าจะเป็นของการชนกันหลังจากตัวเลข N นั้นเท่ากับของโซลูชั่นดั้งเดิมของ OP เคล็ดลับในการใช้เวลาปัจจุบันเป็นเมล็ดมักใช้เมื่อกำหนดคีย์ตามลำดับ
Cort Ammon

2
@Fresheyeball ฉันมั่นใจว่ามันจะไม่มีผลเว้นแต่ Random.makeInt () ไม่ได้สร้างการกระจายแบบสม่ำเสมอจากค่าต่ำสุดของจำนวนเต็มจนถึงค่าสูงสุดของจำนวนเต็ม สำหรับทุกค่าในอดีตที่สร้างโดยฟังก์ชันนี้จะมีค่าสุ่มจาก makeInt ซึ่งสำหรับขั้นตอนเวลาที่แน่นอนนี้จะสร้างมูลค่านั้นและสร้างการชนกัน เนื่องจากค่าทั้งหมดจาก makeInt นั้นสามารถใส่ได้ความน่าจะเป็นของการชนจะเท่ากับค่าความน่าจะเป็นของการชนโดยไม่เพิ่มเวลา
Cort Ammon

2
@CortAmmon นี้ไม่ได้ใช้เวลาปัจจุบันเป็นเมล็ดและมันไม่แน่นอนทำให้แตกต่างกันตราบใดที่ยังไม่มีที่หมายเลขไม่ได้ถูกสร้างขึ้นในช่วงเสี้ยววินาทีเดียวกันเพราะตัวเลขสองกับชิ้นส่วนการประทับเวลาที่แตกต่างกันไม่เคยชน หากคุณจินตนาการถึงตัวอย่างคำตอบอื่นของหนึ่งแพ็คเก็ตต่อวินาทีที่มีโอกาส 50% ของการชนกันในเวลาน้อยกว่าหนึ่งวันอันนี้มีโอกาสที่ 0% ของการชนที่หนึ่งแพ็คเก็ตต่อวินาทีอย่างน้อยจนถึงเวลาที่currentTimeMillisล้อมรอบ
ฮอบส์

3
@hobbs คุณลืมเกี่ยวกับจำนวนเต็มล้น ทีนี้ถ้ากุญแจที่ใช้ OP คือโครงสร้างที่มีจำนวนเต็ม 2 จำนวนตัวหนึ่งมีค่าSystem.currentTimeMillisหนึ่งและอีกอันบรรจุRandom.makeInt()แล้วความน่าจะเป็นของการชนจะลดลงอย่างมาก อย่างไรก็ตามนั่นไม่ใช่สิ่งที่รหัสในตัวอย่างนี้ทำ ได้รับใด ๆครั้งก่อนหน้านี้และความคุ้มค่าแบบสุ่มและใด ๆเวลาปัจจุบันน่าจะเป็นของการปะทะกันเป็นเหมือนน่าจะเป็นของสองตัวเลขสุ่มชนในสถานที่แรก
Cort Ammon

3

ขึ้นอยู่กับความน่าจะเป็นของความล้มเหลวและผลที่ตามมาของความล้มเหลว

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


1

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


0

เป็นที่ยอมรับได้เมื่อสมมติว่าตัวเลขสุ่มจะไม่ซ้ำกัน แต่คุณต้องระวัง

สมมติว่าตัวเลขสุ่มของคุณจะถูกกระจายอย่างเท่าเทียมกันน่าจะเป็นของการปะทะกันเป็นประมาณ (n 2 /2) / k ที่ n คือจำนวนของตัวเลขสุ่มที่คุณสร้างและ k เป็นจำนวนของค่าที่เป็นไปได้เป็นจำนวนมาก "สุ่ม" สามารถใช้

คุณไม่ได้ใส่ตัวเลขในทางดาราศาสตร์ที่ไม่น่าจะเป็นไปได้ดังนั้นให้นำมันมาเป็น 1 ใน 2 30 (ประมาณเป็นพันล้าน) ให้บอกอีกว่าคุณสร้าง 2 30แพ็กเก็ต (ถ้าแต่ละแพ็กเก็ตแสดงข้อมูลประมาณหนึ่งกิโลไบต์ดังนั้นนี่หมายถึงเทราไบต์ของข้อมูลทั้งหมดซึ่งมีขนาดใหญ่ แต่ไม่มากจนเกินไป) เราพบว่าเราต้องการตัวเลขสุ่มที่มีค่าที่เป็นไปได้อย่างน้อย 2 89

ประการแรกตัวเลขสุ่มของคุณจะต้องใหญ่พอ จำนวนสุ่ม 32 บิตสามารถมีได้สูงสุด 2 32ค่าที่เป็นไป สำหรับเซิร์ฟเวอร์ไม่ว่างที่ไม่มีที่อยู่ใกล้สูงพอ

ประการที่สองตัวสร้างตัวเลขสุ่มของคุณต้องมีสถานะภายในที่มีขนาดใหญ่พอสมควร หากตัวสร้างตัวเลขสุ่มของคุณมีสถานะภายใน 32- บิตเท่านั้นไม่ว่ามูลค่าที่คุณสร้างนั้นจะใหญ่เพียงใดก็ตามคุณยังจะได้รับค่าที่เป็นไปได้มากที่สุด 2 32

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

โดยทั่วไปเครื่องกำเนิดตัวเลขสุ่ม "ปกติ" ในภาษาการเขียนโปรแกรมไม่เหมาะสำหรับการใช้งานดังกล่าว เครื่องกำเนิดเลขสุ่มโดยห้องสมุดการเข้ารหัสโดยทั่วไปคือ


0

สร้างขึ้นในบางส่วนของคำตอบข้างต้นคือการสันนิษฐานว่าเครื่องกำเนิดเลขสุ่มนั้นแน่นอนว่า 'แบน' - ความน่าจะเป็นของตัวเลขสองตัวใด ๆ ที่ถูกสร้างขึ้นถัดไปจะเหมือนกัน

นั่นอาจไม่เป็นความจริงสำหรับตัวสร้างตัวเลขสุ่มส่วนใหญ่ ซึ่งส่วนใหญ่ใช้พหุนามลำดับสูงบางส่วนนำไปใช้ซ้ำกับเมล็ด

ที่กล่าวว่ามีหลายระบบออกมีที่ขึ้นอยู่กับรูปแบบนี้มักจะมี UUID ของ ตัวอย่างเช่นทุกวัตถุและทรัพย์สินใน Second Life มี UUID 128 บิตซึ่งสร้างแบบสุ่มและพวกเขาไม่ค่อยเกิดการชนกัน


0

ผู้คนจำนวนมากได้รับคำตอบที่มีคุณภาพสูง แต่ฉันต้องการเพิ่มจุดเล็ก ๆ น้อย ๆ : อันดับแรกจุดของ @nomadictype เกี่ยวกับวันเกิดความขัดแย้งนั้นยอดเยี่ยมมาก

อีกจุดหนึ่ง: การสุ่มนั้นไม่ตรงไปตรงมาในการสร้างและนิยามตามที่คนทั่วไปอาจคิด (อันที่จริงมีการทดสอบทางสถิติสำหรับการสุ่ม )

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

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

อีกสิ่งที่ควรพิจารณา: โอกาสที่จะชนะ Powerball จากการเล่นเกมเดียวคืออย่างที่ฉันเข้าใจแล้วว่าประมาณ 1 ใน 175 ล้าน อย่างไรก็ตามโอกาสของคนที่ชนะจะสูงกว่านั้นมาก คุณสนใจในอัตราต่อรองของใครบางคน "ชนะ" (เช่นการซ้ำซ้อน) มากกว่าในอัตราต่อรองของหมายเลขใด ๆ "ชนะ" / การซ้ำซ้อน


หากมีการสร้างตัวระบุ 4096 บิตในลักษณะที่ว่าทุก ๆ บิตมีโอกาสเท่ากันที่จะเป็น 0 หรือ 1 ซึ่งเป็นอิสระจากบิตอื่น ๆ ที่ถูกสร้างขึ้นในตัวระบุเดียวกันหรือตัวอื่น ๆ ความน่าจะเป็นที่ตัวระบุสองตัวใด ๆ จะมีขนาดเล็กหายไปแม้ว่าจะมีการสุ่มสร้างตัวระบุที่แตกต่างกันสำหรับแต่ละอะตอมประมาณ 4.0E81 ในเอกภพที่สังเกตได้ ความจริงที่ว่าตัวระบุดังกล่าวนั้นแทบจะไม่ซ้ำกันจะไม่ทำให้พวกเขา "ไม่สุ่ม"
supercat

@supercat นั่นเป็นความจริง - เนื่องจากมีจำนวนมากพอมันไม่น่าเป็นไปได้สูงที่จะมีการซ้ำซ้อน แต่มันเป็นไปไม่ได้ มันขึ้นอยู่กับว่าผลที่เกิดจากความไม่เป็นเอกลักษณ์นั้นเลวร้ายเพียงใดไม่ว่าสิ่งที่ OP อธิบายไว้นั้นเป็นความคิดที่ดีหรือไม่
EJoshuaS - คืนสถานะโมนิก้า

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

@supercat ฉันคิดว่าคุณเข้าใจผิดนี้ดูคำตอบอื่น ๆ เกี่ยวกับวันเกิดความขัดแย้งฉันคิดว่ามีความขัดแย้งมากกว่าที่คุณคำนวณ - OP ใช้หมายเลข 32- บิตดังนั้นฉันไม่แน่ใจว่าคุณอยู่ตรงไหน ' กำลังได้รับ 4096 จากและในฐานะที่เป็นชนเผ่าเร่ร่อนแสดงให้เห็นความน่าจะเป็นของการปะทะกันในที่สุดกับจำนวนของความยาวนั้นจริงสูงน่าแปลกใจ
EJoshuaS - คืนสถานะโมนิก้า

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

0

ไม่สำคัญว่าคุณใช้กี่บิตคุณไม่สามารถรับประกันได้ว่าตัวเลข "สุ่ม" สองหมายเลขจะแตกต่างกัน แต่ฉันขอแนะนำให้คุณใช้บางอย่างเช่นที่อยู่ IP หรือที่อยู่เครือข่ายอื่นของคอมพิวเตอร์และหมายเลขต่อเนื่องโดยควรเป็นหมายเลขลำดับ BIG ใหญ่ของ HONKIN - 128 บิต (ไม่ได้ลงนามอย่างชัดเจน) ดูเหมือนเป็นการเริ่มต้นที่ดี แต่ 256 จะดีกว่า


-1

ไม่แน่นอน นอกจากว่าคุณใช้ตัวอย่างโดยไม่มีการเปลี่ยนใหม่มีโอกาสน้อยมากที่จะทำซ้ำ

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