2010-10-10 16 views
7

मैं मैं पर काम कर रहा हूँ एक कॉमन लिस्प अनुप्रयोग में कुछ तार हैश करने के लिए कोशिश कर रहा हूँ के साथ Hashing। एसडी-SHA1 पैकेज समाप्त हो रहा है, और कुछ समय के CLiki पेज है, जो सुदृढ़ बजाय का उपयोग कर पता चलता है द्वारा पहचानने के लिए किया गया है। पर्याप्त मेला,कवचयुक्त और फ्लेक्सी-धाराओं

=> (require 'ironclad) 
NIL 

आयरनक्लाड हालांकि स्ट्रिंग डाइजेस्ट नहीं करता है; यह अपने प्रोजेक्ट पेज पर एक जानबूझकर डिज़ाइन विकल्प के रूप में कहा गया है, जो मुझे करना है, वह मेरी स्ट्रिंग को बाइट-स्ट्रिंग और हैश में परिवर्तित कर रहा है। दूसरे शब्दों

में
=> (ironclad:digest-sequence 
     :sha1 (flexi-streams:string-to-octets "Hello there")) 
#(114 108 118 85 62 26 63 222 162 145 52 243 110 106 242 234 5 236 92 206) 

ठीक है, अब बात यह है कि इस पूरे अभ्यास की बात मूल स्ट्रिंग इनपुट के एक SHA1-टुकड़ों में बांटा स्ट्रिंग, जिसका मतलब है कि मैं वास्तव में ऊपर वापस में कनवर्ट करना चाहते हैं बाहर निकलने के लिए है स्ट्रिंग प्रारूप। लेकिन,

=> (flexi-streams:octets-to-string 
    (ironclad:digest-sequence 
     :sha1 (flexi-streams:string-to-octets "Hello there")) 
    :external-format :utf-8) 

This sequence can't be decoded using UTF-8 as it is too short. 
1 octet missing at then end. 
    [Condition of type FLEXI-STREAMS:EXTERNAL-FORMAT-ENCODING-ERROR] 

Restarts: 
    0: [ABORT] Exit debugger, returning to top level. 

अन्य विकल्प flexi-streams सही एन्कोडिंग का अनुमान लगा देना है।

=> (flexi-streams:octets-to-string 
     (ironclad:digest-sequence 
     :sha1 (flexi-streams:string-to-octets "Hello there"))) 
"rlvU>?Þ¢4ónjòêì\\Î" 

कौन सा काम करता है की तरह है, लेकिन मैं लग रहा है कि परिणाम नियंत्रण वर्ण शामिल करने वाला नहीं है मिलता है। फ्लेक्सी-धाराओं के अनुसार, डिफ़ॉल्ट एन्कोडिंग :latin है, इसलिए मैं वास्तव में इस स्तर पर क्या करना है यकीन नहीं है।

मैं क्या गलत कर रहा हूं? मैं आम लिस्प में SHA1-digested स्ट्रिंग का स्ट्रिंग-प्रस्तुति कैसे प्राप्त करूं?

मामले में यह मायने रखती है, मैं SBCL चल रहा हूँ (से बाहर संस्करण है जो 1.0.29 मेरा मानना ​​है कि है apt-get,) Emacs + कीचड़ के माध्यम से।

उत्तर

9

ironclad:digest-sequenceसे प्राप्त ऑक्टेट्स SHA1 पाचन हैं। आप एक बाइट चाहते हैं कि उन बाइट्स के हेक्साडेसिमल एन्कोडिंग का प्रतिनिधित्व करें। आयरनक्लाड में ऐसा करने के लिए एक फ़ंक्शन है जो अंतर्निहित है: ironclad:byte-array-to-hex-string

+1

मैन, सामान से पूछने से पहले मुझे पूरा दस्तावेज़ पढ़ने के लिए सीखना होगा। आयरनक्लाड पृष्ठ उपरोक्त उपयोगिता कार्यों को सूचीबद्ध करता है। दूसरे शब्दों में, मुझे क्या करना चाहिए था '(लोहेक्लाड: बाइट-सरणी-टू-हेक्स-स्ट्रिंग (आयरनक्लाड: डाइजेस्ट-अनुक्रम: sha1 (ironclad: ascii-string-to-byte-array" हैलो वहाँ "))) ' बजाय (इस में फ्लेक्सी-धाराओं लाने हालांकि यह शायद अभी भी उपयोगी हो सकता है अगर मैं सादे ASCII तार के साथ काम नहीं कर रहा था की )। मुझे सही दिशा बताने के लिए धन्यवाद। – Inaimathi

+0

कोलाहल भी ओकटेट वैक्टर को गैर- ASCII तार एन्कोड करने के लिए उपयोगी है। – Xach

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