2009-12-06 19 views
5

में एक स्ट्रिंग के रूप में दिया डेटा की (SHA1 या md5)क्रिप्टोग्राफिक हैश "abc" के SHA1 हैश मेथेमेटिका

a9993e364706816aba3e25717850c26c9cd0d89d 

एक ही रास्ता मेथेमेटिका में बताने के लिए

है अपने Hash समारोह के साथ कि प्राप्त करने के लिए है
Hash[abc, "SHA"] // IntegerString[#, 16]& 

(IntegerString बात बस यह उत्पादन के लिए हेक्स में अधिकांश प्रयोगों कर की तरह है।)

ध्यान दें कि

Hash["abc", "SHA"] 

"\" abc \ "" के हैश को देता है - जो आप चाहते हैं! वास्तव में, एकमात्र कारण है कि हम "एबीसी" का सही हैश प्राप्त कर सकते थे क्योंकि प्रतीक abc का गणित प्रतिनिधित्व स्ट्रिंग "एबीसी" होता है। तारों के विशाल बहुमत के लिए, यह मामला नहीं होगा।

तो आप गणित में मनमाने ढंग से स्ट्रिंग का हैश कैसे लेते हैं?

+2

ध्यान दें कि हैश मेथेमेटिका के 8 संस्करण में बदल इतना है कि तार के हैश अब अन्य भाषाओं में जैसे ही हैं। – joebolte

उत्तर

6

आप StringToStream का उपयोग कर इसे कम से कम कर सकते हैं और तथ्य यह है कि FileHash एक तर्क के रूप में इनपुट स्ट्रीम ले सकता है। फिर अपने sha1 समारोह हो जाता है:

sha1[s_String] := Module[{stream = StringToStream[s], hash}, 
    hash = FileHash[stream,"SHA"]; 
    Close[stream]; 
    hash] 
+0

यह समाधान और भी सही है क्योंकि 'हैश' 'स्ट्रिंगटॉस्ट्रीम' और 'टूस्ट्रिंग' का उपयोग करता है क्योंकि एक व्यक्ति 'ट्रेस [हैश ["एबीसी", "एसएचए"], _StringToStream के साथ देख सकता है। _ToString, TraceInternal -> True] '। और दुर्भाग्य से यह जावा का व्यापक रूप से उपयोग करता है ... –

2

यहां एक क्लज है जो काम करता है। एक अस्थायी फ़ाइल के लिए स्ट्रिंग लिखें और FileHash का उपयोग करें:

sha1[s_String] := Module[{stream, file, hash}, 
    stream = OpenWrite[]; 
    WriteString[stream, s]; 
    file = Close[stream]; 
    hash = FileHash[file, "SHA"]; 
    DeleteFile[file]; 
    hash] 

तुम भी

hex = IntegerString[#, 16]&; 

को परिभाषित करने और इसके बाद के संस्करण समारोह में [email protected] वापस जाने के लिए चाहते हो सकता है।

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