基于36进制的摘要表示法

11

我想能够取任意字符串,通过哈希函数(如MD5)运行它,然后将结果摘要转换为36进制。

我知道Ruby中已经存在一个Digest库,但据我所知,我无法获取摘要的原始字节;to_s函数映射到hexdigest,当然是16进制。

2个回答

23

Fixnum#to_s接受一个基数作为参数。string#to_i也是如此。因此,您可以将基于16进制的字符串转换为int,然后再转换为基于36进制的字符串:

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

非常好!但是有没有可能以某种方式提取摘要对象的原始字节? - Shaggy Frog
我不知道有内置的方法,但是这个问题/答案展示了如何将Fixnum或Bignum转换为它的二进制补码字节数组:https://dev59.com/_FXTa4cB1Zd3GeqPyyfF - Sammy Larbi
为了以后参考,请查看我的答案(目前在此答案下方)以获取摘要的原始字节。 - Paul Annesley

3

您可以使用Digest::Class#digest访问原始摘要字节:

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

很不幸,从这一点出发我不确定如何将它转换为36进制,除非先通过像Sammy Larbi的答案中所述的另一个数字进制。

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

希望您能找到更好的方法将原始字节转换为base36。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接