2011-03-23 52 views
10

我希望能夠採取任意字符串,通過散列函數(如MD5)運行它,然後解釋base-36中產生的摘要。摘要的基數-36表示

我知道Ruby中已經存在一個Digest庫,但據我所知,我無法獲取摘要的原始字節; to_s函數映射到hexdigest,當然這是基數爲16。

回答

20

Fixnum#to_s接受一個基地作爲參數。那麼string#to_i也是如此。正因爲如此,你可以從基礎-16字符串轉換爲int,然後到基地36字符串:

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

工程太棒了!但是是否有可能以某種方式提取摘要對象的原始字節? – 2011-03-24 00:14:20

+0

沒有內置的,我知道的,但這個問題/答案顯示如何將Fixnum或Bignum轉換爲2的補碼字節數組:http://stackoverflow.com/questions/5284369/ruby-return-byte-array-包含二進制補碼錶示的bignum-fix – 2011-03-24 12:01:33

+0

供將來參考;看到我的答案(目前在這個下面)來獲取摘要的原始字節。 – 2011-12-22 04:40:00

3

可以使用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) 

希望你可以找到一個更好的辦法從原料BYT去es基地36。