2008-09-15 14 views
16

私は外部リンクを指すWebアプリケーションを作成しています。私はURLで使用できる各ドキュメントの非シーケンシャルで推測不可能なIDを作成しようとしています。私は明白なことをしました:URLを文字列とstr#cryptとして扱いますが、それはスラッシュ、ドット、アンダースコアのような英数字以外の文字を詰まらせるようです。ルビーでURLをハッシュするにはどうすればよいですか?

この問題を解決する最善の方法についてのご意見はありますか?

ありがとうございます! Rubyの標準ライブラリから

答えて

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" 

元のコンテンツを知らず、あなたのソースにアクセスできない人のために、このハッシュを生成するのがはるかに難しくなります。

3

また、ダイジェスト名前空間のさまざまなアルゴリズムを調べることをお勧めします。に保証されていない任意のハッシュアルゴリズムの結果ので

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

:それは難しい(またはに加えて)秘密のパスフレーズで塩析、あなたはまた、時間の正確なダンプを使用することができるのではなく、推測するようにするには以前は生成されたハッシュとの結果の一意性をチェックすることを忘れないでください。 Time.nowを使用すると、一意のハッシュが生成されるまで呼び出す必要があるだけなので、再試行は簡単に実装できます。

関連する問題