2008-09-15 371 views
16

我在寫一個指向外部鏈接的web應用程序。我正在爲每個可以在URL中使用的文檔創建一個非順序的,不可猜測的ID。我做了一件顯而易見的事情:把url當作一個字符串和str#crypt來處理,但是它似乎扼殺了任何非字母數字字符,如斜線,點和下劃線。什麼是紅寶石網址的最佳方式?

有關解決此問題的最佳方法的任何建議?

謝謝!

回答

35

取決於你想一個字符串多久,你可以使用一些替代方案:

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" 

請注意,這不會是不可猜測,您可能必須將其與其他一些(祕密但靜態的)數據結合起來以便對字符串加鹽:

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

現在,對於不知道原始內容且無法訪問源代碼的用戶生成此散列變得更加困難。

0

使用Digest::MD5從Ruby的標準庫:

Digest::MD5.hexdigest(my_url) 
3

我還建議看看摘要命名空間中的不同算法。爲了使它更難猜測,而不是(或除了)與祕密口令醃製,也可以使用的時間精確轉儲:

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

由於任何散列算法的結果不能保證是獨一無二的,不要忘記在假設你的散列可用之前檢查你的結果對先前生成的散列的唯一性。 Time.now的使用使重試變得不重要,因爲你只需要調用直到生成一個唯一的哈希。