- สำรวจ วิธีมอบ ID ที่ไม่ซ้ำกันอย่างเด็ดขาดให้กับอุปกรณ์หรือวัตถุ โดยเปรียบเทียบแนวทางแบบสุ่ม (random) กับแบบกำหนดแน่นอน (deterministic)
- แนวทางแบบสุ่มสามารถทำให้โอกาสชนกันแทบเป็น 0 ได้ หากใช้ จำนวนบิตที่มากพอ โดยมีตั้งแต่ UUID (122 บิต) ไปจนถึง ขีดจำกัดการคำนวณของเอกภพทั้งหมด (798 บิต)
- สำหรับแนวทางแบบกำหนดแน่นอน มีการเสนอหลายสคีม เช่น ตัวนับศูนย์กลาง, โครงสร้างลำดับชั้นแบบมอบหมาย (Dewey), ต้นไม้ทวิภาค (Binary), โทเค็น (Token) และวิเคราะห์ ลักษณะการเติบโตของความยาว ID ของแต่ละวิธีผ่านการจำลอง
- ยังมีการนำเสนอการพิสูจน์ทางคณิตศาสตร์ว่า ทุกสคีมแบบกำหนดแน่นอน ไม่อาจหลีกเลี่ยงการเติบโตเชิงเส้น (linear) ในกรณีเลวร้ายที่สุด ได้
- บทสรุปคือ วิธีที่ใช้งานได้จริงและมีประสิทธิภาพแม้ในระดับการขยายตัวแบบจักรวาล คือการสร้าง ID แบบสุ่ม ส่วนวิธีแบบกำหนดแน่นอนนั้นไม่มีประสิทธิภาพ
ความจำเป็นของ ID ที่ไม่ซ้ำกันและการตั้งโจทย์
- การระบุวัตถุ เป็นรากฐานของทุกระบบ ไม่ว่าจะเป็นการผลิต โลจิสติกส์ การสื่อสาร หรือความปลอดภัย และเมื่อขยายขนาดใหญ่ขึ้น การมอบ ID ที่ไม่ซ้ำกันจึงเป็นโจทย์สำคัญ
- แม้มวลมนุษยชาติจะขยายตัวไปถึงระดับกาแล็กซี ก็ยังจำเป็นต้องมี ระบบ ID ที่ไม่ซ้ำกัน
- โจทย์ถูกตั้งไว้ว่า “จะสร้าง ID ที่ไม่มีวันซ้ำกันอย่างเด็ดขาดได้อย่างไร”
แนวทางแบบสุ่ม (Random)
- วิธีที่ง่ายที่สุดคือ เลือกตัวเลขแบบสุ่ม
- สร้างได้จากที่ใดก็ได้โดยไม่ต้องมีการจัดการจากศูนย์กลางหรือการซิงก์
- โอกาสชนกันสามารถ ควบคุมได้ด้วยการเพิ่มจำนวนบิต และปรับให้เข้าใกล้ 0 ได้ในทางปฏิบัติ
- UUID (122 บิต) คาดว่าจะเริ่มเกิดการชนกันเมื่อสร้าง ID ประมาณ $2^{61}$ รายการ
- หากพิจารณา ขีดจำกัดการคำนวณของเอกภพทั้งหมด (10¹²⁰ ครั้ง) จะต้องใช้ 798 บิต
- หากยึดตามระดับอะตอม (10⁸⁰ รายการ) จะอยู่ที่ 532 บิต และสำหรับนาโนบอต 1g (10⁵⁶ รายการ) จะอยู่ที่ 372 บิต
- สิ่งสำคัญคือ การได้มาซึ่งความสุ่มที่แท้จริง และแนะนำให้ใช้ CSPRNG หรือ แหล่งกำเนิดเลขสุ่มเชิงควอนตัม
- ควรห้ามใช้ seed ที่พบได้ทั่วไปหรือ ID ค่าคงที่ (เช่น all-zero)
แนวทางแบบกำหนดแน่นอน (Deterministic)
- วิธี ตัวนับศูนย์กลาง คือให้เซิร์ฟเวอร์เดียวออก ID ตามลำดับ
- เพื่อแก้ปัญหาการเข้าถึง จึงมีข้อเสนอเป็น โครงสร้างการมอบหมายระหว่างดาวเทียมหรืออุปกรณ์ (Dewey)
- สคีม Dewey: ID แบบลำดับชั้นรูป
A.B.C แสดงผลด้วย Elias omega coding
- มีการเติบโตแบบ ลอการิทึม หรือเชิงเส้น ตามโครงสร้างต้นไม้
- สคีม Binary แบ่งพื้นที่ ID ด้วยต้นไม้ทวิภาค และในบางกรณีมีประสิทธิภาพมากกว่า Dewey
- 2-Adic Valuation รับประกันเอกลักษณ์ทางคณิตศาสตร์ และเป็นรูปแบบดัดแปลงของ Binary
- สคีม Token แสดงการเติบโตแบบลอการิทึมในโครงสร้างแบบสายโซ่ แต่เมื่อความกว้างเพิ่มขึ้นจะเปลี่ยนเป็นเชิงเส้น
การพิสูจน์ว่าการเติบโตเชิงเส้นหลีกเลี่ยงไม่ได้
- โดยตั้งอยู่บนสมมติฐานว่า ทุกเส้นทางในการมอบ ID ต้อง ไม่ซ้ำกัน จึงคำนวณจำนวนเส้นทางที่เป็นไปได้
- เมื่อจำนวนโหนดเป็น n จำนวน ID ที่ต้องใช้จะเพิ่มเป็น $2^{n-1}$
- ดังนั้น ความยาว ID ต้องอย่างน้อย O(n) หรือก็คือ ในกรณีเลวร้ายที่สุด การเติบโตเชิงเส้นหลีกเลี่ยงไม่ได้
- ไม่มีอัลกอริทึมใดที่สามารถคงการเติบโตแบบลอการิทึมไว้ได้ในทุกกรณี
การจำลองโมเดลการขยายตัว
- มีการทดลองด้วยโมเดลการเติบโตหลายแบบ เช่น Random Recursive Tree, Preferential Attachment, Fitness Model
- ในขนาดเล็ก (2,048 โหนด) Binary ทำได้ดีที่สุด ส่วน Dewey และ Token แตกต่างกันไปตามสถานการณ์
- ในโมเดล Preferential นั้น Dewey มีประสิทธิภาพสูงสุด
- ในโมเดล Fitness นั้น Dewey และ Binary ให้ผลใกล้เคียงกัน
- แม้ในการทดลองระดับ หนึ่งล้านโหนด Dewey และ Token ก็ยังรักษาการเติบโตแบบลอการิทึมไว้ได้
- ความยาว ID สามารถประมาณได้ในรูป ≈ 6.55 × ln(n)
โมเดลการขยายตัวระดับกาแล็กซีและเอกภพ
- การแพร่กระจายระหว่างดาวเคราะห์ ถูกจำลองเป็นแนวคลื่น (front) ที่เคลื่อนที่ด้วยความเร็วคงที่
- แต่ละดาวเคราะห์จะสร้าง ID ราว 10⁹ รายการ ก่อนจะแพร่ต่อไปยังดาวเคราะห์ถัดไป
- เมื่อรัศมีของกาแล็กซีมีประมาณ 2,121 ดาวเคราะห์ ความยาว ID จะอยู่ที่ประมาณ 288,048 บิต เมื่อแพร่ทั่วทั้งกาแล็กซี
- หากพิจารณาการแพร่ระหว่างกาแล็กซีด้วย (ประมาณ 7,816 ขั้น) จะต้องใช้ ประมาณ 2.2 พันล้านบิต (281MB)
- วิธีแบบกำหนดแน่นอนไม่มีประสิทธิภาพ และ แนวทางแบบสุ่ม (ไม่เกิน 798 บิต) มีประสิทธิภาพเหนือกว่าอย่างมาก
ความปลอดภัยและข้อพิจารณาเพิ่มเติม
- เพื่อ ป้องกันการปลอมแปลง ID สามารถใช้ ระบบตรวจสอบแบบอิงลายเซ็น ได้
- ID แบบสุ่มใช้กุญแจสาธารณะเป็น ID ส่วนสคีมแบบกำหนดแน่นอนให้โหนดแม่ลงลายเซ็นให้กับกุญแจของโหนดลูก
- จำเป็นต้องมี รหัสแก้ไขข้อผิดพลาด และ การจัดการเวอร์ชัน
- สำหรับ วัตถุที่ไม่สามารถเก็บ ID ได้ (เช่น ดาวเคราะห์) สามารถจัดการด้วยการแมปหลาย ID เข้าด้วยกัน
- มีการอภิปรายเรื่องการคงอยู่ของ ID เมื่อมีการเปลี่ยนองค์ประกอบ เช่น ปัญหาเรือของ Theseus
- แนวคิดที่เกี่ยวข้อง: Decentralized Identifiers (DID), Ancestry Labeling Schemes
บทสรุป
- สคีมแบบกำหนดแน่นอนน่าสนใจในเชิงทฤษฎี แต่ใช้งานจริงได้น้อย
- การสร้าง ID แบบสุ่ม เป็นแนวทางที่สมจริงและมีประสิทธิภาพ แม้ในระดับจักรวาล
- การทำให้โอกาสชนกันของ ID “แทบเป็นศูนย์” คือ ทางเลือกที่ปลอดภัยและใช้งานได้จริงที่สุด
4 ความคิดเห็น
ลองอ่านต้นฉบับให้ได้นะครับ เขาอธิบายด้วยสูตรและการจำลองให้เห็นภาพ เลยอ่านได้สนุกมากครับ
ถ้าสร้างจากเวลา ก็น่าจะต้องมองว่าเป็นแบบเชิงเส้นสินะครับ..?
คงต้องไปดูต้นฉบับสักหน่อย เป็นเรื่องที่น่าสนใจครับ
ถ้าชนกันขึ้นมานี่คือโชคร้ายระดับจักรวาลเลยสินะ...(?)
ความเห็นจาก Hacker News
บทวิเคราะห์นี้ไม่ยุติธรรมทั้งหมด ตอนออกแบบ UUID มีการคำนึงถึง locality หรือก็คือความเร็วแสง แต่ตอนคำนวณความน่าจะเป็นการชนกลับละเลยประเด็นนั้นไป ในทางปฏิบัติ การชนกันจะมีความหมายก็ต่อเมื่อ UUID สองตัวนั้นเกิด causal contact กันหลังถูกสร้างขึ้น ดังนั้นการใช้ birthday paradox แบบตรงๆ จึงเป็นวิธีที่ไม่ถูกต้อง ถ้าคำนึงถึง locality ขนาด UUID ที่ต้องใช้ก็น่าจะเล็กกว่า 800 บิตตามบทความมาก ยังไม่ได้คำนวณจริงจัง แต่ไม่น่าจะเกิน 256 บิต สิ่งที่ชอบมากเกี่ยวกับ HN คือเป็นไม่กี่แห่งที่มี การถกเถียงเชิงเทคนิคแบบละเอียดจริงจัง แบบนี้เกิดขึ้นอย่างจริงจัง
เวลาเราคำนวณจำนวนอ็อบเจ็กต์ที่ระบุที่อยู่ได้ ต้องคำนึงด้วยว่าอย่างน้อยต้องมีที่ไหนสักแห่งเก็บที่อยู่ของอ็อบเจ็กต์แต่ละตัวไว้หนึ่งครั้ง ถ้าการเก็บหนึ่งบิตต้องใช้อนุภาค Npb จำนวนหนึ่ง เมื่อจำนวนบิตของที่อยู่เพิ่มขึ้น จำนวนอ็อบเจ็กต์ที่ระบุที่อยู่ได้ก็จะลดลง ดังนั้นจำนวนสูงสุดที่อ้างที่อยู่ได้จึงหาได้จากความสัมพันธ์รูปแบบ Nthg = Np / (Npb * f(Ntng))
ครั้งหนึ่งเคยต้องโต้แย้งว่า random ID แบบ 256 บิตนั้นมากพอจนไม่ต้องตรวจสอบการชนกันด้วยซ้ำ เพื่อนร่วมงานอยากเพิ่ม ตรรกะตรวจสอบการชนกัน ที่ซับซ้อนเข้าไป แต่ผมอธิบายว่า 2^256 มีขนาดพอๆ กับจำนวนอะตอมในเอกภพที่สังเกตได้ และโอกาสที่ดาต้าเซ็นเตอร์จะระเบิดเป็นล้านครั้งยังสูงกว่าที่จะเกิดการชนกัน สุดท้ายก็สรุปกันว่าแค่ 128 บิตก็พอแล้ว
มีการคำนวณว่าถ้าจะกำหนด ID ให้ทุกอะตอมจะต้องใช้ประมาณ 532 บิต แต่ในความเป็นจริงเราน่าจะอยากให้ ID กับกลุ่มอะตอมด้วย เช่น ไมโครชิป รถยนต์ ฯลฯ จึงอาจต้องใหญ่กว่านั้น
มีไอเดียใช้ สำรับไพ่ แทน ID ถ้าแทนไพ่ทั้ง 52 ใบด้วยอักขระ Unicode จะอ่านง่าย แก้ด้วยมือยาก และช่วยให้มองเห็นรูปแบบได้ดี ถ้านำสำรับจริงมาสับแล้วให้กล้องอ่าน ก็ยังใช้เป็น random seed ได้ด้วย แนวคิดคล้ายๆ กันมี DiceKeys
เป็นภาพประกอบและข้อสังเกตที่ยอดเยี่ยม ผมออกแบบฐานข้อมูลโดยยึดตัวระบุแบบสุ่มที่เล็กที่สุดเท่าที่ทำได้เป็นหลัก และมองว่า ตัวระบุสากล แบบนี้คือ ‘golden disk’ เพียงหนึ่งเดียวอย่างแท้จริง ในแวดวงการจัดการข้อมูลวิทยาศาสตร์หรือบรรณารักษศาสตร์ แนวคิดนี้กลับถูกประเมินค่าต่ำเกินไป ปัญหามากมายในองค์กรขนาดใหญ่คงแก้ได้ด้วยการออกแบบตัวระบุที่ดีกว่านี้
บทความที่เกี่ยวข้อง: Identifiers Deep Dive, Trible Structure
ตอนนี้กำลังอ่าน Becky Chambers เรื่อง 『The Galaxy, and the Ground Within』 แถวๆ หน้า 281
ตัวอย่างข้อความในหนังสือ:
ชอบซีรีส์นี้มาก การตั้งค่าจักรวาลหลายเผ่าพันธุ์ที่ใช้ ระบบที่อยู่เส้นทางซึ่งตกลงร่วมกันจากส่วนกลาง น่าสนใจมาก
เพิ่งไปรู้จัก Snowflake ID มาไม่นาน ใช้กันใน Twitter, Discord, Instagram, Mastodon ฯลฯ เป็นวิธีลดขนาด ID ด้วยการผสม timestamp + random ซึ่งน่าเสียดายที่บทความไม่ได้พูดถึง
ดูเพิ่มเติมที่ Snowflake ID บนวิกิ, วิดีโอของ Tom Scott
ถ้าเปลี่ยนบางบิตของ timestamp ใน Snowflake ให้เป็นแบบสุ่ม ก็น่าจะสร้าง ID ได้ 4 พันล้านตัวต่อวินาที
สงสัยว่าจะสร้าง ID จาก ปรากฏการณ์ที่สังเกตได้ ได้ไหม ด้วยคุณสมบัติที่แยกกันได้ด้วยเวลาและระยะทาง จึงอาจรับประกันความไม่ซ้ำได้ เช่น รูปแบบแสงดาว ณ ช่วงเวลาหนึ่งมีเพียงคนเดียวเท่านั้นที่มองเห็น มันคล้ายการใช้ noise เป็น entropy แบบ lava lamp ถ้าสามารถนิยามระบบพิกัดของเอกภพทั้งหมดได้ ก็ดูเหมือนจะสร้าง ID ที่ไม่ซ้ำได้จากการรวม local time + x + y + z + salt
วิธี random UUID เหนือกว่ามากในแง่อายุการใช้งาน จำนวนอุปกรณ์ที่ทำงานพร้อมกันได้มีจำกัด และต่างจาก UUID แบบ tree-based ตรงที่เมื่อเลิกใช้อุปกรณ์แล้วก็สามารถนำ ID กลับมาใช้ใหม่ได้ ในทางปฏิบัติ อัลกอริทึมแบบผสมที่ใช้ รากตามตำแหน่ง + บิตย่อยแบบสุ่ม น่าจะใช้งานได้จริงที่สุด