Каков наилучший способ хэширования URL в ruby? - PullRequest
16 голосов
/ 16 сентября 2008

Я пишу веб-приложение, которое указывает на внешние ссылки. Я пытаюсь создать непоследовательный, не угадываемый идентификатор для каждого документа, который я могу использовать в URL. Я сделал очевидную вещь: обработал url как строку и str # crypt на нем, но это, похоже, душит любые неалфавитные символы, такие как косые черты, точки и подчеркивания.

Какие-нибудь предложения по наилучшему способу решения этой проблемы?

Спасибо!

Ответы [ 3 ]

35 голосов
/ 16 сентября 2008

В зависимости от длины строки, которую вы хотели бы использовать, вы можете использовать несколько альтернатив:

require 'digest'
Digest.hexencode('http://foo-bar.com/yay/?foo=bar&a=22')
# "687474703a2f2f666f6f2d6261722e636f6d2f7961792f3f666f6f3d62617226613d3232"

require 'digest/md5'
Digest::MD5.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22')
# "43facc5eb5ce09fd41a6b55dba3fe2fe"

require 'digest/sha1'
Digest::SHA1.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22')
# "2aba83b05dc9c2d9db7e5d34e69787d0a5e28fc5"

require 'digest/sha2'
Digest::SHA2.hexdigest('http://foo-bar.com/yay/?foo=bar&a=22')
# "e78f3d17c1c0f8d8c4f6bd91f175287516ecf78a4027d627ebcacfca822574b2"

Обратите внимание, что это не будет невозможно, вам, возможно, придется объединить его с некоторыми другими (секретными, но статическими) данными, чтобы засолить строку:

salt = 'foobar'
Digest::SHA1.hexdigest(salt + 'http://foo-bar.com/yay/?foo=bar&a=22')
# "dbf43aff5e808ae471aa1893c6ec992088219bbb"

Теперь становится намного сложнее генерировать этот хэш для тех, кто не знает исходного контента и не имеет доступа к вашему источнику.

3 голосов
/ 16 сентября 2008

Я бы также предложил рассмотреть различные алгоритмы в пространстве имен дайджеста. Чтобы было сложнее угадать, чем (или в дополнение к) посолить секретную фразу-пароль, вы также можете использовать точный дамп времени:

require 'digest/md5'
def hash_url(url)
  Digest::MD5.hexdigest("#{Time.now.to_f}--#{url}")
end

Поскольку результат любого алгоритма хеширования не гарантированно является уникальным, не забудьте проверить уникальность вашего результата по сравнению с ранее сгенерированными хешами, прежде чем предполагать, что ваш хеш пригоден для использования. Использование Time.now делает повторное выполнение тривиальным, поскольку вам нужно только вызывать, пока не будет сгенерирован уникальный хеш.

0 голосов
/ 16 сентября 2008

Использование Дайджест :: MD5 из стандартной библиотеки Ruby:

Digest::MD5.hexdigest(my_url)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...