← Blog

ลิงก์สั้นที่ไม่มีวันชนและไม่มีวันเต็ม — เบื้องหลังโค้ด 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 ไม่เก็บสถิติการคลิก ซึ่งต่างจากบริการย่อลิงก์เกือบทั้งหมด

ผลที่ตามมาคือฐานข้อมูลมีขนาดเล็กและไม่โตตามจำนวนทราฟฟิก ลิงก์ที่มีคนคลิกล้านครั้งกินพื้นที่เท่ากับลิงก์ที่ไม่มีใครคลิกเลย

และเมื่อไม่เก็บ ก็ไม่มีข้อมูลพฤติกรรมของผู้คลิกให้ต้องดูแล ไม่ต้องตอบคำถามว่าเก็บอะไรไว้บ้าง เก็บนานแค่ไหน และใครเข้าถึงได้

เป็นการแลกที่ชัดเจน — เราแลกฟีเจอร์ที่หลายคนคาดหวัง กับระบบที่เล็ก เร็ว และอธิบายให้ลูกค้าฟังได้ในประโยคเดียว

ทำไมเราถึงเล่าเรื่องนี้

เพราะการเลือกวิธีสร้างโค้ดสั้นเป็นตัวอย่างที่ดีของการตัดสินใจที่ราคาถูกตอนเริ่ม แต่แพงมากตอนแก้

ถ้าเริ่มด้วยการสุ่มแล้วเช็ค ระบบจะทำงานได้ดีไปอีกนานจนกว่าจะโต แล้วตอนที่ต้องเปลี่ยนก็จะเป็นตอนที่มีลิงก์ของลูกค้าใช้งานอยู่จริงแล้วเปลี่ยนไม่ได้

งานของเราคือมองเห็นจุดแบบนี้ตั้งแต่ก่อนเขียนบรรทัดแรก และเลือกทางที่ยังถูกต้องอยู่เมื่อระบบโตขึ้นสิบเท่า

HShort

ย่อลิงก์ให้สั้น พร้อม QR code

ดูรายละเอียด →

อ่านต่อ

HShort

HShort เปิดใช้งานแล้ว — ย่อลิงก์พร้อม QR code

สินค้าตัวที่ 5 ของเรา เปิดใช้งานที่ hshort.co แล้ว — วางลิงก์ยาว ได้ลิงก์สั้นพร้อม QR code ตั้งชื่อลิงก์เองได้ กำหนดวันหมดอายุได้ และมี API

HShort

HShort 1.1.0 — ยืนยันอีเมล รีเซ็ตรหัสผ่าน และหน้าตาแบบ 8-bit

อัปเดตใหญ่ในวันเดียวกับรีลีสแรก — บังคับยืนยันอีเมลก่อนสร้างลิงก์ เพิ่มรีเซ็ตรหัสผ่าน ตรวจ URL ตั้งแต่ก่อนสมัคร รองรับ IPv6 และเปลี่ยนหน้าแรกเป็นธีม 8-bit

HShort

HShort 1.0.0 — เวอร์ชันแรกที่เปิดใช้งานจริง

รีลีสแรกของ HShort — สมัครสมาชิก ย่อลิงก์ ตั้งชื่อลิงก์เอง กำหนดวันหมดอายุ สร้าง QR code และมี REST API ให้ยิงสร้างลิงก์อัตโนมัติ