Представление дайджеста в Base-36

Я хотел бы иметь возможность взять произвольную строку, запустить ее через функцию хеширования (например, MD5), а затем интерпретировать полученный дайджест в base-36.

Я знаю, что в Ruby уже существует библиотека дайджеста, но, насколько я могу судить, я не могу получить необработанные байты дайджеста; функция to_s сопоставляется с hexdigest, что, конечно же, соответствует основанию 16.


person Shaggy Frog    schedule 23.03.2011    source источник


Ответы (2)


Fixnum#to_s принимает базу в качестве аргумента. Как и string#to_i. Из-за этого вы можете преобразовать строку base-16 в int, а затем в base 36 строку:

i = hexstring.to_i(16)
base_36 = i.to_s(36)
person Sammy Larbi    schedule 23.03.2011
comment
Прекрасно работает! Но можно ли как-то извлечь необработанные байты объекта Digest? - person Shaggy Frog; 24.03.2011
comment
Я ничего не знаю о встроенном, но этот вопрос/ответ показывает, как вы можете преобразовать Fixnum или Bignum в массив байтов дополнения 2: stackoverflow.com/questions/5284369/ - person Sammy Larbi; 24.03.2011
comment
Для дальнейшего использования; см. мой ответ (в настоящее время ниже этого), чтобы получить необработанные байты дайджеста. - person Paul Annesley; 22.12.2011

Вы можете получить доступ к необработанным байтам дайджеста, используя дайджест ::Класс#дайджест:

Digest::SHA1.digest("test")
# => "\xA9J\x8F\xE5\xCC\xB1\x9B\xA6\x1CL\bs\xD3\x91\xE9\x87\x98/\xBB\xD3"

К сожалению, с этого момента я не уверен, как получить его в base36, не пройдя сначала через другую базу чисел, как в ответе Сэмми Ларби.

bytes = Digest::SHA1.digest("test")
Digest.hexencode(bytes).to_i(16).to_s(36)

Надеюсь, вы сможете найти лучший способ перейти от необработанных байтов к base36.

person Paul Annesley    schedule 06.06.2011