เครื่องมือสร้าง CUID ที่มีประสิทธิภาพสำหรับตัวระบุเอกลักษณ์ในระบบ
สร้างตัวระบุเอกลักษณ์ที่ทนต่อการชนกัน (CUIDs) สำหรับระบบกระจาย ฐานข้อมูล และแอปพลิเคชันเว็บ สร้าง ID ที่ขยายได้และเรียงลำดับได้ทันที
ตัวสร้าง CUID
สร้าง ID ที่ป้องกันการชนกันได้อย่างรวดเร็วและง่ายดาย
เอกสารประกอบการใช้งาน
CUID คืออะไร?
CUID (ตัวระบุเฉพาะที่ทนต่อการชนกัน) คือสตริงสั้น ๆ ที่ประกอบด้วยตัวอักษรและตัวเลข ใช้ระบุระเบียน ไฟล์ หรือเหตุการณ์ เพื่อไม่ให้รายการสองรายการมีชื่อเดียวกัน เครื่องมือนี้สร้าง CUID2 ซึ่งเป็นรูปแบบเวอร์ชันปัจจุบัน โดยใช้ไลบรารี @paralleldrive/cuid2 แต่ละรหัสมีความยาว 25 อักขระ ประกอบด้วยตัวอักษรพิมพ์เล็กและตัวเลขเท่านั้น และสร้างขึ้นทั้งหมดในเบราว์เซอร์ โดยไม่มีการส่งข้อมูลไปยังเซิร์ฟเวอร์
วิธีใช้เครื่องมือสร้าง CUID นี้
- คลิก สร้าง CUID ใหม่ เพื่อสร้างรหัส
- คลิก คัดลอกไปยังคลิปบอร์ด เพื่อคัดลอกรหัส
- วางรหัสลงในฐานข้อมูล ชื่อไฟล์ หรือแอปพลิเคชัน
- คลิกสร้างอีกครั้งเพื่อสร้างรหัสอื่น โอกาสที่ค่า CUID2 สองค่าจะแตกต่างกันแต่ชนกันนั้นต่ำมาก แม้จะไม่ใช่สิ่งที่เป็นไปไม่ได้ในทางคณิตศาสตร์
- คลิก รีเซ็ต เพื่อล้างผลลัพธ์
รหัสที่สร้างขึ้นจะถูกเก็บไว้ใน URL ของหน้าเว็บด้วย จึงสามารถแชร์หรือบันทึกลิงก์ไปยังผลลัพธ์ได้
โครงสร้างและสูตรของ CUID2
CUID2 ถูกสร้างขึ้นดังนี้:
1id = randomLetter + base36( SHA3-512( time + entropy + counter + fingerprint ) ).substring(1, length)
2ฟังก์ชันแฮชจะผสมข้อมูลนำเข้าส่วนตัวสี่รายการ ได้แก่ เวลาปัจจุบัน ตัวนับประจำเซสชัน ลายนิ้วมือของเครื่องโฮสต์ และเอนโทรปีแบบสุ่ม จากนั้นประมวลผลผ่าน SHA3-512 แปลงผลลัพธ์เป็นเลขฐาน 36 (ตัวเลข 0–9 และตัวอักษร a-z) แล้วเก็บไว้ 24 อักขระ ตัวอักษรนำหน้าแบบสุ่มทำให้รหัสที่เสร็จสมบูรณ์มีความยาว 25 อักขระ ซึ่งเป็นความยาวที่เครื่องมือนี้กำหนดไว้
มีเพียง อักขระตัวแรก เท่านั้นที่แยกเป็นส่วนเดี่ยว โดยเป็นตัวอักษรสุ่มที่วางไว้ด้านหน้า เพื่อให้รหัสทุกตัวเริ่มต้นด้วยตัวอักษรแทนที่จะเป็นตัวเลข ระบบจำนวนมาก เช่น ชื่อตารางและคอลัมน์ SQL กำหนดให้ตัวระบุต้องขึ้นต้นด้วยตัวอักษร จึงทำให้ CUID2 ปลอดภัยสำหรับใช้เป็นชื่อได้เกือบทุกที่ อักขระทุกตัวหลังตัวแรกเป็นส่วนหนึ่งของเนื้อหาแฮชทึบแสงที่ต่อเนื่องกันทั้งหมด ไม่มีการแบ่งส่วนย่อย
เนื่องจากแฮชทำงานทางเดียว จึงไม่สามารถดึงข้อมูลนำเข้าใด ๆ กลับออกจากรหัสที่เสร็จสมบูรณ์ได้ CUID2 ไม่มีเวลาที่กู้คืนได้ ไม่มีตัวนับที่กู้คืนได้ และไม่มีลายนิ้วมือที่กู้คืนได้ นี่เป็นการตัดสินใจโดยเจตนาเพื่อความเป็นส่วนตัวและความปลอดภัย กล่าวคือ รหัสเพียงอย่างเดียวไม่สามารถเปิดเผยได้ว่าสร้างขึ้นเมื่อใดหรือที่ใด
ตัวอย่างพร้อมวิธีทำ
การสร้างรหัสด้วยเครื่องมือนี้อาจได้ผลลัพธ์ดังนี้:
1vcpuhcj51eomj1o31dnlqopu0
2ในที่นี้ v คือตัวอักษรนำหน้าแบบสุ่ม และ cpuhcj51eomj1o31dnlqopu0 (มี 24 อักขระ) คือเนื้อหาแฮช ทั้งสองส่วนดูแตกต่างกันเพียงเพราะมีการรับประกันว่าอักขระตัวแรกต้องเป็นตัวอักษร ส่วนเนื้อหาแฮชสามารถมีทั้งตัวอักษรและตัวเลขผสมกัน
เหตุผลที่ระบบต่าง ๆ ใช้ CUID2
- ไม่ต้องประสานงานกัน เครื่องใด ๆ ก็สามารถสร้างรหัสที่ถูกต้องได้ด้วยตนเอง โดยไม่ต้องขอค่าถัดไปจากเซิร์ฟเวอร์กลางหรือฐานข้อมูล
- ทนต่อการชนกัน การผสมผสานระหว่างเวลา ตัวนับ ลายนิ้วมือของโฮสต์ และเอนโทรปีแบบสุ่ม ทำให้โอกาสที่เครื่องสองเครื่องจะสร้างรหัสเดียวกันต่ำมาก แม้จะสร้างรหัสหลายรายการต่อวินาทีก็ตาม
- เหมาะสำหรับ URL CUID2 ใช้เฉพาะตัวอักษรพิมพ์เล็กและตัวเลข จึงไม่จำเป็นต้องเข้ารหัสเมื่อนำไปใช้ในที่อยู่เว็บ
- สร้างได้รวดเร็วและเป็นส่วนตัว เนื่องจากเครื่องมือนี้เรียกใช้ตัวสร้างรหัสในเบราว์เซอร์ รหัสจึงถูกสร้างขึ้นทันทีและไม่ออกจากอุปกรณ์
รหัส CUID2 ไม่สามารถเรียงตามเวลาที่สร้างได้ ต่างจากตัวเลขเพิ่มอัตโนมัติของฐานข้อมูลหรือรูปแบบ CUID รุ่นเก่า (เวอร์ชัน 1) CUID2 ซ่อนเวลาประทับไว้ภายในแฮชแทนที่จะจัดเก็บให้เห็นโดยตรง แอปพลิเคชันที่ต้องเรียงระเบียนตามลำดับการสร้างควรจัดเก็บคอลัมน์เวลาประทับแยกต่างหากควบคู่กับรหัส
CUID2 เทียบกับ UUID และรหัสเพิ่มอัตโนมัติ
| คุณลักษณะ | CUID2 | UUID v4 | เพิ่มค่าอัตโนมัติ |
|---|---|---|---|
| ความยาว | 25 อักขระ | 36 อักขระ (มีขีดกลาง) | แตกต่างกัน (โดยทั่วไปเป็นตัวเลขสั้น ๆ) |
| ชุดอักขระ | ตัวอักษรพิมพ์เล็กและตัวเลข | เลขฐานสิบหกและขีดกลาง | ตัวเลข |
| ต้องมีการประสานงานจากส่วนกลาง | ไม่ | ไม่ | ใช่ (ลำดับของฐานข้อมูล) |
| เรียงตามเวลาที่สร้างได้ | ไม่ | ไม่ | ใช่ |
| เหมาะสำหรับ URL โดยไม่ต้องเข้ารหัส | ใช่ | ใช่ | ใช่ |
CUID2 และ UUID v4 แก้ปัญหาเดียวกัน นั่นคือการสร้างรหัสโดยไม่ต้องประสานงานจากส่วนกลาง CUID2 สั้นกว่าและใช้ชุดอักขระที่เล็กกว่า จึงอ่านและวางลงใน URL ได้ง่ายกว่า UUID ก็ปลอดภัยสำหรับใช้ในที่อยู่เว็บเช่นกัน เพราะขีดกลางเป็นอักขระที่ไม่จำเป็นต้องเข้ารหัสใน URL แต่มีความยาวมากกว่า 11 อักขระ
การใช้งานทั่วไป
- คีย์หลักในฐานข้อมูลแบบกระจาย ซึ่งเซิร์ฟเวอร์หลายเครื่องเพิ่มแถวข้อมูลได้อย่างอิสระ
- รหัสคำขอหรือรหัสติดตามที่ใช้ติดตามการดำเนินการหนึ่งรายการผ่านไมโครเซอร์วิสหลายตัว
- ชื่อไฟล์สำหรับไฟล์ที่อัปโหลด เพื่อไม่ให้ไฟล์สองไฟล์เขียนทับกัน
- รหัสเซสชันหรือโทเค็นสำหรับเว็บแอปพลิเคชัน
- รหัสข้อความในคิว เช่น Kafka หรือ RabbitMQ
ประวัติโดยย่อ
รูปแบบ CUID ดั้งเดิมเผยแพร่โดย Eric Elliott ในปี 2012 เพื่อเป็นทางเลือกแทน UUID สำหรับแอปพลิเคชันแบบกระจาย CUID2 ซึ่งเผยแพร่โดยโครงการ Paralleldrive เดียวกัน ได้ออกแบบรูปแบบใหม่โดยใช้แฮชเข้ารหัส และนำเวลาประทับกับตัวนับที่กู้คืนได้ซึ่งรุ่นดั้งเดิมเปิดเผยไว้ออกไป เครื่องมือนี้สร้างเฉพาะรหัส CUID2 เท่านั้น
คำถามที่พบบ่อย
CUID (v1) แตกต่างจาก CUID2 อย่างไร CUID v1 จัดเก็บเวลาประทับและตัวนับที่มองเห็นได้ไว้ภายในรหัส ทำให้เรียงตามลำดับได้ แต่ก็เปิดเผยว่ารหัสถูกสร้างขึ้นเมื่อใดและสร้างไปแล้วกี่รายการ CUID2 แทนที่ข้อมูลที่มองเห็นได้เหล่านั้นด้วยแฮชทางเดียว จึงไม่สามารถอ่านข้อมูลใด ๆ ย้อนกลับจากรหัสได้
CUID จากเครื่องมือนี้เรียงตามเวลาที่สร้างได้หรือไม่ ไม่ได้ CUID2 ไม่มีเวลาประทับที่กู้คืนได้ จึงไม่สามารถจัดลำดับรหัสตามเวลาที่สร้างได้เพียงดูจากสตริง
รหัสที่สร้างขึ้นมีความยาวเท่าใด และเปลี่ยนความยาวได้หรือไม่ เครื่องมือนี้สร้างรหัสที่มีความยาว 25 อักขระเสมอ ไม่มีตัวเลือกในเครื่องมือนี้สำหรับขอความยาวอื่น
เครื่องสองเครื่องที่แตกต่างกันสามารถสร้าง CUID2 เดียวกันในเวลาเดียวกันได้หรือไม่ ในทางทฤษฎีเป็นไปได้ แต่ในทางปฏิบัติมีโอกาสเกิดขึ้นน้อยมาก รหัสแต่ละรายการผสมลายนิ้วมือเฉพาะของโฮสต์เข้ากับเอนโทรปีแบบสุ่ม ดังนั้นจึงมีโอกาสน้อยมากที่เครื่องอิสระสองเครื่องจะสร้างแฮชเดียวกัน
เครื่องมือนี้ส่งข้อมูลใด ๆ ไปยังเซิร์ฟเวอร์หรือไม่ ไม่ รหัสถูกสร้างโดย JavaScript ที่ทำงานในเบราว์เซอร์ โดยใช้นาฬิกาของระบบภายในเครื่องและค่าความสุ่มที่เบราว์เซอร์จัดหาให้ ไม่มีการส่งข้อมูลใด ๆ
สามารถใช้ CUID2 เป็นคีย์หลักของฐานข้อมูลได้หรือไม่
ได้ รหัส CUID2 เหมาะสำหรับใช้เป็นคีย์หลักในฐานข้อมูลแบบกระจาย เนื่องจากทุกโหนดสามารถสร้างรหัสได้โดยไม่ต้องตรวจสอบกับลำดับส่วนกลาง รหัสเหล่านี้ไม่ได้เรียงตามเวลาที่เพิ่มข้อมูลโดยธรรมชาติ ดังนั้นแอปพลิเคชันที่ต้องการลำดับดังกล่าวควรเก็บคอลัมน์ created_at แยกต่างหาก