2011-02-17 99 views
6

我想從Ruby中更長的字符串創建短的非碰撞字符串。什麼是最好的方法來做到這一點? Base64編碼MD5哈希?什麼是從一個更長的字符串生成短哈希字符串的最佳方式

這是用例:

loop do 
    key = short_hash("#{user_id}-#{timestamp}") 
    break if $redis.setnx(key, "0") 
end 

我不想鍵太長。

+0

這個網站上有很多關於類似主題的問題。嘗試搜索哈希主題。這裏是一個:http://stackoverflow.com/questions/4066601/developing-a-url-shortener/4066615#4066615 – 2011-02-17 00:53:47

+1

@Sugerman:這個問題是在Python中。 – 2011-02-17 01:12:13

+2

如果您閱讀這些(以及其他)線索中的回覆,您可能會收集到的是最好的方式是語言不可知的。首先選擇你的哈希算法,然後擔心特定於語言的實現。 – 2011-02-17 01:25:00

回答

4

我經常使用一個SHA來做這個和你有相似的例子。它不能保證是唯一的,但通常對於大多數來說已經足夠好:

require 'digest/sha1' 
Digest::SHA1.hexdigest("#{user_id}-#{Time.now.to_i}-#{rand}") 

ruby UUID gem是另一種選擇。

但在您的具體情況下,因爲您使用的是Redis,爲什麼不使用redis INCR命令?那麼你至少可以保證數據庫中的唯一性。例如:

unique_key = $redis.incr('users:next') 
4

您可以使用散列函數創建不是的較短的字符串,以避免可能發生衝突。然而,Pigeonhole principle保證,你將能夠找到兩個更長的字符串,將散列到相同的值。

要生成真正獨特的值,您可能必須分配一個順序標識號。但是,這也需要您跟蹤哪個識別號碼與哪個輸入字符串相關聯。

相關問題