我试图在Ruby中用更长的字符串创建短的非碰撞字符串.最好的方法是什么?Base64编码MD5哈希?
这是用例:
loop do
key = short_hash("#{user_id}-#{timestamp}")
break if $redis.setnx(key, "0")
end
Run Code Online (Sandbox Code Playgroud)
我不希望钥匙太长.
我经常使用 SHA 来实现这一点,类似于您拥有的示例。它不能保证是唯一的,但通常足以满足大多数目的:
require 'digest/sha1'
Digest::SHA1.hexdigest("#{user_id}-#{Time.now.to_i}-#{rand}")
Run Code Online (Sandbox Code Playgroud)
该红宝石UUID的宝石是另一种选择。
但是在您使用 redis 的特定情况下,为什么不使用 redis INCR命令呢?然后您可以保证至少在您的数据库中的唯一性。例如:
unique_key = $redis.incr('users:next')
Run Code Online (Sandbox Code Playgroud)