我想从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