2011-03-23 11 views
10

का बेस -36 प्रतिनिधित्व मैं एक मनमानी स्ट्रिंग लेने में सक्षम होना चाहता हूं, इसे एक हैशिंग फ़ंक्शन (जैसे एमडी 5) के माध्यम से चलाएं, और फिर बेस -36 में परिणामी पाचन की व्याख्या करें।डाइजेस्ट

मुझे पता है कि रुबी में एक डाइजेस्ट लाइब्रेरी मौजूद है, लेकिन जहां तक ​​मैं कह सकता हूं कि मैं पाचन के कच्चे बाइट्स पर नहीं पहुंच सकता; to_s फ़ंक्शन को hexdigest पर मैप किया गया है, जो निश्चित रूप से बेस -16 है।

उत्तर

20

Fixnum # to_s तर्क के रूप में आधार स्वीकार करता है। तो स्ट्रिंग # to_i करता है। इस वजह से, आप किसी पूर्णांक पर आधार -16 स्ट्रिंग से परिवर्तित कर सकते हैं, 36 स्ट्रिंग तो आधार पर:

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

बढ़िया काम करता है! लेकिन क्या किसी भी तरह से डायजेस्ट ऑब्जेक्ट के कच्चे बाइट निकालना संभव है? –

+0

उसमें कुछ भी नहीं बनाया गया है, लेकिन यह प्रश्न/उत्तर दिखाता है कि आप फिक्सम या बिग्नम को इसके 2 के पूरक बाइट सरणी में कैसे परिवर्तित कर सकते हैं: http://stackoverflow.com/questions/5284369/ruby-return-byte-array- भविष्य में संदर्भ के लिए युक्त-जुड़वां-पूरक-प्रतिनिधित्व-का-बिग्नम-फिक्स –

+0

; एक पाचन के कच्चे बाइट प्राप्त करने के लिए मेरा उत्तर (वर्तमान में इस के नीचे) देखें। –

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 से जाने के लिए एक बेहतर तरीका मिल सकता है बेस 36 के लिए es।

संबंधित मुद्दे