我想從Ruby中更長的字符串創建短的非碰撞字符串。什麼是最好的方法來做到這一點? Base64編碼MD5哈希?什麼是從一個更長的字符串生成短哈希字符串的最佳方式
這是用例:
loop do
key = short_hash("#{user_id}-#{timestamp}")
break if $redis.setnx(key, "0")
end
我不想鍵太長。
我想從Ruby中更長的字符串創建短的非碰撞字符串。什麼是最好的方法來做到這一點? Base64編碼MD5哈希?什麼是從一個更長的字符串生成短哈希字符串的最佳方式
這是用例:
loop do
key = short_hash("#{user_id}-#{timestamp}")
break if $redis.setnx(key, "0")
end
我不想鍵太長。
我經常使用一個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')
您可以使用散列函數創建不是的較短的字符串,以避免可能發生衝突。然而,Pigeonhole principle保證,你將能夠找到兩個更長的字符串,將散列到相同的值。
要生成真正獨特的值,您可能必須分配一個順序標識號。但是,這也需要您跟蹤哪個識別號碼與哪個輸入字符串相關聯。
這個網站上有很多關於類似主題的問題。嘗試搜索哈希主題。這裏是一個:http://stackoverflow.com/questions/4066601/developing-a-url-shortener/4066615#4066615 – 2011-02-17 00:53:47
@Sugerman:這個問題是在Python中。 – 2011-02-17 01:12:13
如果您閱讀這些(以及其他)線索中的回覆,您可能會收集到的是最好的方式是語言不可知的。首先選擇你的哈希算法,然後擔心特定於語言的實現。 – 2011-02-17 01:25:00