Base-36 представительство Digest - PullRequest
10 голосов
/ 24 марта 2011

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

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

Ответы [ 2 ]

20 голосов
/ 24 марта 2011

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

i = hexstring.to_i(16)
base_36 = i.to_s(36)
3 голосов
/ 06 июня 2011

Вы можете получить доступ к необработанным байтам дайджеста, используя 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.

...