คำตอบสั้นๆ สำหรับคำถามแฮชของคุณคือ "ใช้ SHA-256" นั่นคือคำตอบสำหรับปัญหาการแฮชที่ปลอดภัยเกือบทุกข้อ เว้นแต่คำตอบคือ "ใช้ SHA-512" หากคุณต้องการแฮช 128 บิต คุณสามารถตัดทอน SHA-256 (ใช้ 128 บิตแรกหรือ 128 บิตสุดท้าย) บิตทั้งหมดใน SHA-256 เป็นอิสระจากกัน ดังนั้นคุณจึงสามารถแยก 128 บิตเป็นแฮชได้
ที่กล่าวว่า IMO คุณกำลังคิดเกี่ยวกับปัญหานี้ไม่ถูกต้อง ประเด็นไม่ได้เกี่ยวกับการปกป้อง SessionId โดยเฉพาะปัญหาคือ URL อาจมีข้อมูลที่ละเอียดอ่อน ซึ่ง SessionId เป็นเพียงตัวอย่างหนึ่งเท่านั้น (หากเก็บไว้ใน URL) หากมีคนทราบ URL ที่ย่อแล้ว พวกเขาก็สามารถขอ URL แบบเต็มจากระบบของคุณได้ ดังนั้น ทั้งหมดนี้จึงเกี่ยวกับการหยุดผู้โจมตีที่ค้นหาคีย์ด้วยการเดา คุณต้องทำให้คีย์สเปซของคุณเบาบางลง ซึ่งก็คือ "มาก ใหญ่กว่าจำนวนคีย์ที่เก็บไว้จริงๆ"
คุณกำลังดูแลฐานข้อมูลคีย์/ค่า ดังนั้นจึงไม่จำเป็นต้องใช้แฮชเลย คุณสามารถสร้างคีย์สุ่มสำหรับแต่ละ URL สิ่งนี้ดีกว่าแฮชเพราะไม่มีการเชื่อมต่อระหว่างคีย์และค่าเลย
ด้วยการออกแบบของคุณ ผู้โจมตีไม่สามารถค้นหาแบบออฟไลน์ได้ พวกเขาต้องติดต่อเซิร์ฟเวอร์ของคุณ สมมติว่าคุณให้บริการได้ 1,000 คำขอ/วินาที และคุณปรับขนาดพื้นที่คีย์ทั้งหมดให้ใหญ่กว่าจำนวน URL ที่วางแผนไว้ถึงล้านล้านเท่า ผู้โจมตีจะใช้เวลาประมาณ 15,000 ปี (ประมาณ 1/2 ของพื้นที่ที่ค้นหา) เพื่อค้นหา URL เดียว หากพวกเขาสามารถใช้แบนด์วิดท์ทั้งหมดของคุณที่มีอยู่ (ซึ่งฉันคาดว่าคุณอาจสังเกตเห็น....) ด้วยการจำกัดอัตราเพียงเล็กน้อยต่อที่อยู่ IP คุณสามารถทำให้การโจมตีนี้ซับซ้อนขึ้นอย่างมาก
จากที่กล่าวมา หากคุณต้องการจัดเก็บ URL พันล้านรายการในระบบของคุณ คุณต้องมีคีย์สเปซดังนี้:
log2(1 พันล้าน URL * ตัวคูณ 1 ล้านล้าน) = 80 บิต
ใน Base58 (ซึ่งผมชอบโจทย์แบบนี้เพราะเป็นมิตรกับมนุษย์) จะใช้อักขระประมาณ 14 ตัว ปรับแต่งค่าด้านบนสำหรับการจำกัดอัตรา ระยะเวลาของการโจมตีที่คุณต้องการป้องกัน และจำนวน URL ที่เก็บไว้ คุณสามารถเลือกระยะเวลาของคีย์ของคุณได้
โดยทั่วไปคุณสามารถคำนวณค่าสุ่มในระดับนี้ได้โดยไม่ต้องกังวลเกี่ยวกับการชนกัน (ซึ่งเป็นสิ่งที่ดีสำหรับประสิทธิภาพ) ด้วยเหตุผลเดียวกับที่ผู้โจมตีหาการชนกันได้ยากมากๆ จึงไม่น่าเป็นไปได้อย่างยิ่งที่คุณจะชนกันโดยบังเอิญ แต่ถ้าคุณต้องการตรวจสอบอีกครั้ง อย่างไร ไม่น่าจะดูที่ การโจมตีวันเกิด. การคำนวณสำหรับ "ความเป็นไปได้ที่ค่าใดๆ ชนกันคือเท่าใด" จะแตกต่างจาก "ผู้โจมตีจะใช้เวลานานแค่ไหนในการค้นหาการชนกัน" และในบางกรณีจะบังคับให้คุณใช้คีย์ที่ยาวขึ้น
IMO ไม่จำเป็นต้องแฮช แต่ถ้าคุณต้องการ ให้ใช้ SHA-256 ตัดให้เหลือจำนวนบิตเท่าที่คุณต้องการ