ruby with Каков наилучший способ хэширования URL-адреса в рубине?




url helper rails (3)

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

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

Благодаря!


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

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"

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


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

Digest::MD5.hexdigest(my_url)

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

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

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





ruby