10

我希望能够获取任意字符串,通过散列函数(如 MD5)运行它,然后以 base-36 解释生成的摘要。

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

4

2 回答 2

22

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

i = hexstring.to_i(16)
base_36 = i.to_s(36)
于 2011-03-23T23:54:46.100 回答
3

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

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

不幸的是,从那时起,我不确定如何在不先通过另一个数字基数(如 Sammy Larbi 的答案)的情况下将其放入 base36 中。

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

希望您能找到从原始字节到 base36 的更好方法。

于 2011-06-06T03:59:08.263 回答