2011-04-04 1 views
0

У меня есть требование «выполнить хэширование SHA1 в байтах UTF-8 строки». Я не уверен, как получить байты UTF-8. Вот пример того, что я должен получить:Получить байты UTF-8 из строки в Ruby

original = "http://www.provider.com/article?query=mysearch&abcd&1300459467&our secret key" 
#Perform the sha1 hashing on the UTF-8 bytes of this string, to get ... 
expected_hashed = "99802fec87b6ef1d45bd07f3053d13 6cfcfbdf0b" 
#... which is a 160 byte fingerprint. 
#You need to then take the 20 byte representation of this string (make sure you're 
#not just taking the hex string), and base 64 encode that. 
expected_encoded = "mYAv7Ie27x1FvQfzBT0TbPz73ws=" 

Это становится от original к expected_hashed, что дает мне проблему: я не знаю, как получить UTF-8 байт из. Я делаю хэширование SHA1 как Digest::SHA1.digest(unhashed_string), и я не уверен на 100%, что это подходит и в этом случае. :/Я также не знаю, что такое «20-байтное представление этой строки».

+0

На самом деле понял, UTF-8/хеширования часть: если я делаю 'Digest :: SHA1.hexdigest (unhashed_string)', что дает мне expected_hashed значение. Я все еще не знаю, что такое 20-байтовое представление этого. –

+0

Какая версия Ruby? –

+0

'ruby 1.8.6 (2007-09-23 patchlevel 110) [x86_64-linux]' (это старый сервер) –

ответ

4
require 'digest' 
require 'base64' 
Base64.encode64(Digest::SHA1.digest(original)[0,20]) 
# => "mYAv7Ie27x1FvQfzBT0TbPz73ws=\n" 
+0

Отлично! Спасибо Младен. –

+0

Или вы можете просто сделать: Digest :: SHA1.base64digest original – Amala