Подтвердить что ты не робот

Какой лучший способ хешировать URL-адрес в рубине?

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

Любые предложения по наилучшему способу решения этой проблемы?

Спасибо!

4b9b3361

Ответ 1

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

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"

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

Ответ 2

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

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

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

Ответ 3

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

Digest::MD5.hexdigest(my_url)