2008-09-15 39 views
16

Tôi đang viết một ứng dụng web trỏ đến các liên kết bên ngoài. Tôi đang tìm cách tạo một id không tuần tự, không thể đoán trước cho mỗi tài liệu mà tôi có thể sử dụng trong URL. Tôi đã làm điều hiển nhiên: xử lý url như một chuỗi và str # crypt trên nó, nhưng điều đó dường như bị nghẹt thở trên bất kỳ ký tự không phải chữ và số, như dấu gạch chéo, dấu chấm và dấu gạch dưới.Cách tốt nhất để băm url trong ruby ​​là gì?

Bất kỳ đề xuất nào về cách tốt nhất để giải quyết vấn đề này?

Cảm ơn!

Trả lời

35

Tùy theo bạn muốn một cách dài chuỗi, bạn có thể sử dụng một vài lựa chọn:

require 'digest' 
Digest.hexencode('http://foo-bar.com/yay/?foo=bar&a=22') 
# "687474703a2f2f666f6f2d6261722e636f6d2f7961792f3f666f6f3d62617226613d3232" 

require 'digest/md5' 
Digest::MD5.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22') 
# "43facc5eb5ce09fd41a6b55dba3fe2fe" 

require 'digest/sha1' 
Digest::SHA1.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22') 
# "2aba83b05dc9c2d9db7e5d34e69787d0a5e28fc5" 

require 'digest/sha2' 
Digest::SHA2.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22') 
# "e78f3d17c1c0f8d8c4f6bd91f175287516ecf78a4027d627ebcacfca822574b2" 

Lưu ý rằng điều này sẽ không được unguessable, bạn có thể phải kết hợp nó với một số dữ liệu khác (bí mật nhưng tĩnh) để muối chuỗi:

salt = 'foobar' 
Digest::SHA1.hexdigest(salt + 'http://foo-bar.com/yay/?foo=bar&a=22') 
# "dbf43aff5e808ae471aa1893c6ec992088219bbb" 

Bây giờ, việc tạo băm này trở nên khó khăn hơn đối với những người không biết nội dung gốc và không có quyền truy cập vào nguồn của bạn.

0

Sử dụng Digest::MD5 từ thư viện chuẩn của Ruby:

Digest::MD5.hexdigest(my_url) 
3

Tôi cũng sẽ đề xuất xem xét các thuật toán khác nhau trong không gian tên thông báo. Để làm cho nó khó đoán hơn, chứ không phải (hoặc bổ sung cho) muối với một cụm từ mật khẩu bí mật, bạn cũng có thể sử dụng một bãi chứa chính xác thời gian:

require 'digest/md5' 
def hash_url(url) 
    Digest::MD5.hexdigest("#{Time.now.to_f}--#{url}") 
end 

Kể từ khi kết quả của bất kỳ thuật toán băm không đảm bảo là duy nhất, đừng quên kiểm tra tính duy nhất của kết quả của bạn trước các băm được tạo trước đó trước khi giả sử rằng băm của bạn có thể sử dụng được. Việc sử dụng Time.now làm cho việc thử lại tầm thường thực hiện, vì bạn chỉ phải gọi cho đến khi một băm duy nhất được tạo ra.

Các vấn đề liên quan