2011-02-17 45 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保证,你将能够找到两个更长的字符串,将散列到相同的值。

要生成真正独特的值,您可能必须分配一个顺序标识号。但是,这也需要您跟踪哪个识别号码与哪个输入字符串相关联。

相关问题