ลิงก์สั้นที่ไม่มีวันชนและไม่มีวันเต็ม — เบื้องหลังโค้ด 3 ตัวอักษรของ HShort
เวลาสร้างบริการย่อลิงก์ คำถามแรกคือ “โค้ดสั้น ๆ ท้าย URL มาจากไหน”
คำตอบที่พบบ่อยที่สุดคือสุ่มมา แล้วเช็คกับฐานข้อมูลว่าซ้ำหรือยัง ถ้าซ้ำก็สุ่มใหม่ วิธีนี้ใช้ได้และเขียนง่าย แต่มีปัญหาที่โผล่ตอนโตขึ้น
ปัญหาของการสุ่มแล้วเช็ค
ตอนมีลิงก์ในระบบไม่กี่พันอัน โอกาสสุ่มชนแทบเป็นศูนย์ ทุกอย่างเร็วและเรียบร้อย
แต่เมื่อจำนวนลิงก์เข้าใกล้ความจุของความยาวโค้ดที่เลือกไว้ โอกาสชนจะสูงขึ้นเรื่อย ๆ ระบบต้องสุ่มหลายรอบขึ้นเรื่อย ๆ ต่อการสร้างลิงก์หนึ่งอัน
ที่แย่กว่านั้นคือทุกครั้งที่สุ่มต้องถามฐานข้อมูล การสร้างลิงก์หนึ่งอันจึงกลายเป็นการถามฐานข้อมูลหลายรอบ และเมื่อพื้นที่ใกล้เต็มจริง ๆ ก็อาจวนไม่จบ
ผลคือระบบทำงานดีมาตลอดแล้วช้าลงอย่างฉับพลันเมื่อโตถึงจุดหนึ่ง ซึ่งเป็นรูปแบบความล้มเหลวที่แย่ที่สุด เพราะมันเกิดตอนที่บริการกำลังไปได้ดี
วิธีที่เราเลือก
HShort ไม่สุ่มเลย แต่แปลงเลขลำดับของลิงก์ให้เป็นฐาน 62
ฐาน 62 คือการใช้ตัวอักษร 62 ตัวเป็นเลขหลักแทนที่จะใช้แค่ 0-9 ได้แก่ 0-9 (10 ตัว) a-z (26 ตัว) และ A-Z (26 ตัว)
ลิงก์ทุกอันในระบบมีเลขลำดับประจำตัวที่ฐานข้อมูลออกให้อยู่แล้ว และเลขนั้นไม่มีวันซ้ำโดยธรรมชาติ เราแค่แปลงมันให้อยู่ในรูปที่สั้นลง
ผลที่ได้ตามมาทันที
- ไม่ต้องเช็คว่าซ้ำหรือไม่ เพราะเลขลำดับไม่มีทางซ้ำ — ประหยัดการถามฐานข้อมูลไปทั้งหมด
- ความเร็วคงที่ ไม่ว่าในระบบจะมีลิงก์อยู่กี่อัน การสร้างลิงก์ใหม่ใช้เวลาเท่าเดิมเสมอ
- ไม่มีวันเต็ม เมื่อเลขลำดับข้ามขอบเขต โค้ดก็ยาวขึ้นทีละหนึ่งตัวเอง
ความจุที่ได้
เราเริ่มที่ 3 ตัวอักษร ซึ่งครอบคลุมได้ไกลกว่าที่คนส่วนใหญ่คาด
| ความยาวโค้ด | รองรับได้ถึง |
|---|---|
| 3 ตัว | ~238,000 ลิงก์ |
| 4 ตัว | ~14.7 ล้าน |
| 5 ตัว | ~916 ล้าน |
| 6 ตัว | ~56,800 ล้าน |
ทุกครั้งที่เพิ่มหนึ่งตัวอักษร ความจุคูณด้วย 62 — และเพิ่มได้ไม่จำกัด
ข้อแลกเปลี่ยนที่ต้องพูดถึง
วิธีนี้มีข้อเสียที่ตรงไปตรงมา — โค้ดเดาต่อได้ ถ้ารู้ว่าลิงก์หนึ่งคือ q0V ก็เดาได้ว่าลิงก์ถัดไปคืออะไร
เราคิดว่านี่รับได้สำหรับบริการย่อลิงก์ ด้วยสองเหตุผล
อย่างแรก — ลิงก์ย่อไม่ใช่ความลับโดยธรรมชาติ มันถูกสร้างมาเพื่อแปะให้คนเห็นและกด ใครก็ตามที่ได้รับลิงก์ก็เข้าถึงปลายทางได้อยู่แล้ว การเดาโค้ดถัดไปได้จึงไม่ได้เปิดเผยอะไรที่ปกปิดไว้
อย่างที่สอง — ถ้าต้องการโค้ดที่เดาไม่ได้ ก็ตั้งชื่อเองได้ ผู้ใช้กำหนดชื่อลิงก์ของตัวเองได้อยู่แล้ว ซึ่งเหมาะกับงานที่ต้องการทั้งความจำง่ายและความไม่ต่อเนื่อง
สิ่งที่เราไม่ทำคือแกล้งทำเป็นว่าข้อเสียนี้ไม่มี ถ้าโจทย์ของคุณคือลิงก์ที่ต้องเดาไม่ได้จริง ๆ เช่นลิงก์รีเซ็ตรหัสผ่าน วิธีนี้ไม่เหมาะ และเราก็ไม่ได้ใช้วิธีนี้กับลิงก์ประเภทนั้น
สิ่งที่เราเลือกไม่เก็บ
อีกการตัดสินใจหนึ่งที่มาคู่กันคือ HShort ไม่เก็บสถิติการคลิก ซึ่งต่างจากบริการย่อลิงก์เกือบทั้งหมด
ผลที่ตามมาคือฐานข้อมูลมีขนาดเล็กและไม่โตตามจำนวนทราฟฟิก ลิงก์ที่มีคนคลิกล้านครั้งกินพื้นที่เท่ากับลิงก์ที่ไม่มีใครคลิกเลย
และเมื่อไม่เก็บ ก็ไม่มีข้อมูลพฤติกรรมของผู้คลิกให้ต้องดูแล ไม่ต้องตอบคำถามว่าเก็บอะไรไว้บ้าง เก็บนานแค่ไหน และใครเข้าถึงได้
เป็นการแลกที่ชัดเจน — เราแลกฟีเจอร์ที่หลายคนคาดหวัง กับระบบที่เล็ก เร็ว และอธิบายให้ลูกค้าฟังได้ในประโยคเดียว
ทำไมเราถึงเล่าเรื่องนี้
เพราะการเลือกวิธีสร้างโค้ดสั้นเป็นตัวอย่างที่ดีของการตัดสินใจที่ราคาถูกตอนเริ่ม แต่แพงมากตอนแก้
ถ้าเริ่มด้วยการสุ่มแล้วเช็ค ระบบจะทำงานได้ดีไปอีกนานจนกว่าจะโต แล้วตอนที่ต้องเปลี่ยนก็จะเป็นตอนที่มีลิงก์ของลูกค้าใช้งานอยู่จริงแล้วเปลี่ยนไม่ได้
งานของเราคือมองเห็นจุดแบบนี้ตั้งแต่ก่อนเขียนบรรทัดแรก และเลือกทางที่ยังถูกต้องอยู่เมื่อระบบโตขึ้นสิบเท่า
ย่อลิงก์ให้สั้น พร้อม QR code