Основание-36

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

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

Ответ 1

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

i = hexstring.to_i(16)
base_36 = i.to_s(36)

Ответ 2

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

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.