2010-05-13 11 views
6

वीबीए का उपयोग कर फ़ाइल के लिए एमडी 5 हेक्स हैश कैसे प्राप्त कर सकता हूं?वीबीए का उपयोग कर फाइल के लिए एमडी 5 हेक्स हैश कैसे प्राप्त करें?

मुझे एक ऐसे संस्करण की आवश्यकता है जो फ़ाइल के लिए काम करे।

कुछ इस अजगर कोड के रूप में सरल:

import hashlib 

def md5_for_file(fileLocation, block_size=2**20): 
    f = open(fileLocation) 
    md5 = hashlib.md5() 
    while True: 
     data = f.read(block_size) 
     if not data: 
      break 
     md5.update(data) 
    f.close() 
    return md5.hexdigest() 

लेकिन VBA में।

उत्तर

3
+0

जो केवल एक स्ट्रिंग का हैश बनाता है। अगर फ़ाइल में 700 एमबी है, तो मैं इसे एक स्ट्रिंग में नहीं डाल सकता और एमडी 5 हैश करता हूं। तो, क्या फाइल संस्करण या किसी अन्य समाधान के लिए md5 हैश है? : पी –

-1

यह करना चाहिए:

 Dim fileBytes() As Byte = File.ReadAllBytes(path:=fullPath) 
     Dim Md5 As New MD5CryptoServiceProvider() 
     Dim byteHash() As Byte = Md5.ComputeHash(fileBytes) 
     Return Convert.ToBase64String(byteHash) 
+0

हू? सबसे पहले, यह वीबीएनईटी वीबीए नहीं है और दूसरा, आप कुछ बहुत ही महत्वपूर्ण आयात कमांड छोड़ रहे हैं। – Ben

+0

ओह, मैंने VBA.NET के रूप में वीबीए को गलत पढ़ा था। वीबीए काफी कठिन होगा, क्योंकि इसमें सभी .NET ढांचे का समर्थन नहीं है जो उपरोक्त कोड को इतना आसान बनाता है। आयात के लिए, विजुअल स्टूडियो शायद आपके लिए स्वचालित रूप से सुझाव देगा, लेकिन पूरा होने के लिए, वे System.IO और System.Security.Cryptography हैं। –

14

एक पुराना सवाल है कि एक बेहतर जवाब इस्तेमाल कर सकते हैं। ये फ़ंक्शन विशेष रूप से हैशिंग फ़ाइलों के लिए हैं, हैशिंग पासवर्ड के लिए नहीं। बोनस के रूप में, मैं SHA1 के लिए एक फ़ंक्शन समेत हूं। यदि आप प्रकार की घोषणाओं से छुटकारा पा लेते हैं तो ये कार्य VBScript में भी काम करते हैं, सिवाय इसके कि GetSileBytes फ़ंक्शन को FileSystemObject (या संभवतः एडीओ स्ट्रीम) का उपयोग करने के लिए बदला जाना आवश्यक है क्योंकि नि: शुल्क फ़ाइल VBScript में मौजूद नहीं है।

Private Sub TestMD5() 
    Debug.Print FileToMD5Hex("C:\test.txt") 
    Debug.Print FileToSHA1Hex("C:\test.txt") 
End Sub 

Public Function FileToMD5Hex(sFileName As String) As String 
    Dim enc 
    Dim bytes 
    Dim outstr As String 
    Dim pos As Integer 
    Set enc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider") 
    'Convert the string to a byte array and hash it 
    bytes = GetFileBytes(sFileName) 
    bytes = enc.ComputeHash_2((bytes)) 
    'Convert the byte array to a hex string 
    For pos = 1 To LenB(bytes) 
     outstr = outstr & LCase(Right("0" & Hex(AscB(MidB(bytes, pos, 1))), 2)) 
    Next 
    FileToMD5Hex = outstr 
    Set enc = Nothing 
End Function 

Public Function FileToSHA1Hex(sFileName As String) As String 
    Dim enc 
    Dim bytes 
    Dim outstr As String 
    Dim pos As Integer 
    Set enc = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider") 
    'Convert the string to a byte array and hash it 
    bytes = GetFileBytes(sFileName) 
    bytes = enc.ComputeHash_2((bytes)) 
    'Convert the byte array to a hex string 
    For pos = 1 To LenB(bytes) 
     outstr = outstr & LCase(Right("0" & Hex(AscB(MidB(bytes, pos, 1))), 2)) 
    Next 
    FileToSHA1Hex = outstr 'Returns a 40 byte/character hex string 
    Set enc = Nothing 
End Function 

Private Function GetFileBytes(ByVal path As String) As Byte() 
    Dim lngFileNum As Long 
    Dim bytRtnVal() As Byte 
    lngFileNum = FreeFile 
    If LenB(Dir(path)) Then ''// Does file exist? 
     Open path For Binary Access Read As lngFileNum 
     ReDim bytRtnVal(LOF(lngFileNum) - 1&) As Byte 
     Get lngFileNum, , bytRtnVal 
     Close lngFileNum 
    Else 
     Err.Raise 53 
    End If 
    GetFileBytes = bytRtnVal 
    Erase bytRtnVal 
End Function 
+0

त्वरित प्रश्न: UTF8Encoding के लिए चर "asc" कहीं भी उपयोग नहीं किया जाता है, क्या यह एक उद्देश्य प्रदान करता है? इसके अलावा, इसके लिए वीबीस्क्रिप्ट के साथ काम करने के लिए आपको शायद फ्रीफाइल विधि के बजाय ADODB.Stream ऑब्जेक्ट का उपयोग करके फ़ाइल खोलनी होगी ... किसी भी मामले में ग्रेट शेयर! –

+0

मुझे लगता है कि जब मैं इस कोड का उपयोग हैश पासवर्ड पर कर रहा था तब से "एसी" सामान कलाकृतियों से अवगत होना चाहिए। मैंने इसे अभी हटा दिया है। और हां, वीबीस्क्रिप्ट में नि: शुल्क फ़ाइल मौजूद नहीं है। मुझे एक ऐसा फ़ंक्शन मिला जो मुझे लगता है कि फ़ाइल सिस्टम ऑब्जेक्ट का उपयोग करने वाले काम पर किया जा सकता है: http://stackoverflow.com/questions/6060529/read-and-write-binary-file-in-vbscript – HK1

+0

अच्छा समाधान, साथ चुनने के लिए कुछ नट्स ... 'मंद बाइट्स() बाइट के रूप में एक छोटा सा लाभ प्रदान करता है; और इसे पुन: कॉन्फ़िगर किए गए 'प्राइवेट सब गेटफाइलबाइट्स (एसएफआईएल नाम के रूप में स्ट्रिंग, एआरबीइट्स() बाइट के रूप में संदर्भित करते हुए) का अर्थ है कि आप एक अनावश्यक स्मृति आवंटन को हटा देते हैं - और यह संसाधन उपयोग और प्रदर्शन के लिए * वास्तविक * लाभ है। कमरे में हाथी यह है कि, वास्तव में बड़ी फ़ाइलों के लिए, 'ReDim bytRtnVal (एलओएफ (lngFileNum) - 1 और) बाइट' त्रुटियों को उठाएगा। लेकिन मैं कुछ भी बेहतर पोस्ट नहीं कर सकता, क्योंकि मुझे सिस्टम में किसी भी 'चंकिंग' या स्ट्रीमिंग एपीआई के बारे में पता नहीं है। सुरक्षा। क्रिप्टोग्राफी फ़ंक्शंस। –

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