Câu trả lời ngắn gọn cho câu hỏi băm của bạn là "sử dụng SHA-256." Đó là câu trả lời cho hầu hết mọi vấn đề về băm an toàn, trừ khi câu trả lời là "sử dụng SHA-512." Nếu bạn muốn hàm băm 128 bit, thì bạn có thể cắt bớt SHA-256 (lấy 128 lần cắn đầu tiên hoặc cuối cùng). Tất cả các bit trong SHA-256 đều độc lập, vì vậy bạn có thể trích xuất 128 bit bất kỳ dưới dạng hàm băm.
Điều đó nói rằng, IMO bạn đang nghĩ về vấn đề này không chính xác. Vấn đề không phải là bảo vệ SessionId một cách cụ thể.Vấn đề là các URL có thể chứa thông tin nhạy cảm, trong đó SessionId chỉ là một ví dụ (nếu nó được lưu trữ trong URL). Nếu ai đó đã biết URL rút gọn, họ có thể yêu cầu hệ thống của bạn cung cấp URL đầy đủ, vì vậy, đây là tất cả về việc ngăn chặn những kẻ tấn công tìm khóa bằng cách đoán. Bạn cần làm cho không gian khóa của mình trở nên thưa thớt, nghĩa là "lớn hơn rất nhiều so với số lượng khóa thực sự được lưu trữ."
Bạn đang duy trì cơ sở dữ liệu khóa/giá trị, vì vậy không cần sử dụng hàm băm nào cả. Bạn chỉ có thể tạo một khóa ngẫu nhiên cho mỗi URL. Điều này tốt hơn hàm băm vì hoàn toàn không có kết nối nào giữa khóa và giá trị.
Với thiết kế của bạn, kẻ tấn công không thể tìm kiếm ngoại tuyến. Họ phải liên hệ với máy chủ của bạn. Giả sử bạn có thể phân phát 1.000 yêu cầu/giây và bạn mở rộng tổng không gian khóa của mình lớn hơn một nghìn tỷ lần so với số lượng URL dự kiến. Điều đó sẽ khiến kẻ tấn công mất khoảng 15.000 năm (~ 1/2 không gian được tìm kiếm) để tìm một URL duy nhất nếu chúng có thể sử dụng tất cả băng thông có sẵn của bạn (điều mà tôi mong bạn có thể nhận thấy....). Chỉ với một chút giới hạn tốc độ cho mỗi địa chỉ IP, bạn có thể làm phức tạp cuộc tấn công này một cách đáng kể.
Với những điều trên, nếu bạn muốn lưu trữ một tỷ URL trong hệ thống của mình, bạn cần có một không gian khóa là:
log2(1 tỷ URL * 1 nghìn tỷ hệ số) = 80 bit
Trong Base58 (mà tôi thích cho loại vấn đề này vì nó thân thiện với con người), nó sẽ mất khoảng 14 ký tự. Tinh chỉnh các giá trị trên để giới hạn tốc độ, thời gian tấn công bạn muốn bảo vệ và số lượng URL được lưu trữ, bạn có thể chọn thời lượng khóa của mình.
Nói chung, bạn có thể tính toán các giá trị ngẫu nhiên trên thang đo này mà không phải lo lắng về xung đột (điều này tốt cho hiệu suất). Vì lý do tương tự mà kẻ tấn công cực kỳ khó tìm thấy một vụ va chạm, nên việc bạn vô tình gặp phải một vụ va chạm là điều cực kỳ khó xảy ra. Nhưng nếu bạn muốn kiểm tra lại chỉ thế nào không chắc, nhìn vào tấn công sinh nhật. Các tính toán cho "khả năng xảy ra xung đột của bất kỳ giá trị nào" khác với "kẻ tấn công sẽ mất bao lâu để tìm thấy xung đột" và trong một số trường hợp sẽ buộc bạn phải sử dụng các phím dài hơn.
IMO không cần băm. Nhưng nếu bạn cần một cái, hãy sử dụng SHA-256, được cắt bớt thành bất kỳ số lượng bit nào bạn muốn.