Каков наилучший способ создать короткую строку хеша из более длинной строки - PullRequest
6 голосов
/ 17 февраля 2011

Я пытаюсь создать короткие не встречающиеся строки из более длинных строк в Ruby.Какой лучший способ сделать это?Base64 кодирует хеш MD5?

Это вариант использования:

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

Я не хочу, чтобы ключ был слишком длинным.

Ответы [ 2 ]

4 голосов
/ 17 февраля 2011

Я часто использую SHA для этого аналогично примеру, который у вас есть. Он не гарантированно уникален, но обычно достаточно хорош для большинства целей:

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

рубиновый UUID gem является еще одним вариантом.

Но в вашем конкретном случае, поскольку вы используете redis, почему бы просто не использовать команду redis INCR ? Тогда вы можете гарантировать уникальность хотя бы в вашей базе данных. Например:

unique_key = $redis.incr('users:next')
4 голосов
/ 17 февраля 2011

Вы можете использовать хеш-функцию для создания более коротких строк, которые не могут столкнуться. Тем не менее, принцип Pigeonhole гарантирует , что вы сможете найти две более длинные строки, которые будут хэшироваться до одинакового значения.

Чтобы сгенерировать действительно уникальные значения, вам может потребоваться назначить последовательный идентификационный номер. Но для этого также необходимо отслеживать, какой идентификационный номер связан с какой входной строкой.

...