首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

有个MD5的类在检测文件时比较慢懂这方面的高手帮修改下解决方案

2012-01-18 
有个MD5的类在检测文件时比较慢懂这方面的高手帮修改下如果ByteBuffer值能大些比如65535这样速度就快多了。

有个MD5的类在检测文件时比较慢懂这方面的高手帮修改下
如果ByteBuffer值能大些比如65535这样速度就快多了。但是发现如果这样MD5值就不唯一了。我也试着修改了下还是不行。只有请研究这方面高手修改下。
Option   Explicit
Private   Const   OFFSET_4   =   4294967296#
Private   Const   MAXINT_4   =   2147483647
Private   State(4)   As   Long
Private   ByteCounter   As   Long
Private   ByteBuffer(63)   As   Byte
Private   Const   S11   =   7
Private   Const   S12   =   12
Private   Const   S13   =   17
Private   Const   S14   =   22
Private   Const   S21   =   5
Private   Const   S22   =   9
Private   Const   S23   =   14
Private   Const   S24   =   20
Private   Const   S31   =   4
Private   Const   S32   =   11
Private   Const   S33   =   16
Private   Const   S34   =   23
Private   Const   S41   =   6
Private   Const   S42   =   10
Private   Const   S43   =   15
Private   Const   S44   =   21

Property   Get   RegisterA()   As   String
        RegisterA   =   State(1)
End   Property

Property   Get   RegisterB()   As   String
        RegisterB   =   State(2)
End   Property

Property   Get   RegisterC()   As   String
        RegisterC   =   State(3)
End   Property

Property   Get   RegisterD()   As   String
        RegisterD   =   State(4)
End   Property

Public   Function   Md5_String_Calc(SourceString   As   String)   As   String
        MD5Init
        MD5Update   LenB(StrConv(SourceString,   vbFromUnicode)),   StringToArray(SourceString)
        MD5Final
        Md5_String_Calc   =   GetValues
End   Function

Public   Function   Md5_File_Calc(InFile   As   String)   As   String
        On   Error   GoTo   errorhandler
        Dim   FileO   As   Integer
        FileO   =   FreeFile
        Call   FileLen(InFile)
        Open   InFile   For   Binary   Access   Read   As   #FileO
        MD5Init
        Do   While   Not   EOF(FileO)
                DoEvents
                Get   #FileO,   ,   ByteBuffer
                If   Loc(FileO)   <   LOF(FileO)   Then
                        ByteCounter   =   ByteCounter   +   64
                        MD5Transform   ByteBuffer
                End   If
        Loop
        ByteCounter   =   ByteCounter   +   (LOF(FileO)   Mod   64)


        Close   #FileO
        MD5Final
        Md5_File_Calc   =   GetValues
        Exit   Function
errorhandler:
        Md5_File_Calc   =   " "
End   Function

Private   Function   StringToArray(InString   As   String)   As   Byte()
        Dim   I   As   Integer,   bytBuffer()   As   Byte
        ReDim   bytBuffer(LenB(StrConv(InString,   vbFromUnicode)))
        bytBuffer   =   StrConv(InString,   vbFromUnicode)
        StringToArray   =   bytBuffer
End   Function

Public   Function   GetValues()   As   String
        GetValues   =   LongToString(State(1))   &   LongToString(State(2))   &   LongToString(State(3))   &   LongToString(State(4))
End   Function

Private   Function   LongToString(Num   As   Long)   As   String
                Dim   A   As   Byte,   B   As   Byte,   C   As   Byte,   D   As   Byte
                A   =   Num   And   &HFF&
                If   A   <   16   Then   LongToString   =   "0 "   &   Hex(A)   Else   LongToString   =   Hex(A)
                B   =   (Num   And   &HFF00&)   \   256
                If   B   <   16   Then   LongToString   =   LongToString   &   "0 "   &   Hex(B)   Else   LongToString   =   LongToString   &   Hex(B)
                C   =   (Num   And   &HFF0000)   \   65536
                If   C   <   16   Then   LongToString   =   LongToString   &   "0 "   &   Hex(C)   Else   LongToString   =   LongToString   &   Hex(C)
                If   Num   <   0   Then   D   =   ((Num   And   &H7F000000)   \   16777216)   Or   &H80&   Else   D   =   (Num   And   &HFF000000)   \   16777216
                If   D   <   16   Then   LongToString   =   LongToString   &   "0 "   &   Hex(D)   Else   LongToString   =   LongToString   &   Hex(D)
End   Function

Public   Sub   MD5Init()
        ByteCounter   =   0
        State(1)   =   UnsignedToLong(1732584193#)
        State(2)   =   UnsignedToLong(4023233417#)
        State(3)   =   UnsignedToLong(2562383102#)
        State(4)   =   UnsignedToLong(271733878#)
End   Sub

Public   Sub   MD5Final()


        Dim   dblBits   As   Double,   padding(72)   As   Byte,   lngBytesBuffered   As   Long
        padding(0)   =   &H80
        dblBits   =   ByteCounter   *   8
        lngBytesBuffered   =   ByteCounter   Mod   64
        If   lngBytesBuffered   <=   56   Then   MD5Update   56   -   lngBytesBuffered,   padding   Else   MD5Update   120   -   ByteCounter,   padding
        padding(0)   =   UnsignedToLong(dblBits)   And   &HFF&
        padding(1)   =   UnsignedToLong(dblBits)   \   256   And   &HFF&
        padding(2)   =   UnsignedToLong(dblBits)   \   65536   And   &HFF&
        padding(3)   =   UnsignedToLong(dblBits)   \   16777216   And   &HFF&
        padding(4)   =   0
        padding(5)   =   0
        padding(6)   =   0
        padding(7)   =   0
        MD5Update   8,   padding
End   Sub

Public   Sub   MD5Update(InputLen   As   Long,   InputBuffer()   As   Byte)
        Dim   II   As   Integer,   I   As   Integer,   J   As   Integer,   K   As   Integer,   lngBufferedBytes   As   Long,   lngBufferRemaining   As   Long,   lngRem   As   Long

        lngBufferedBytes   =   ByteCounter   Mod   64
        lngBufferRemaining   =   64   -   lngBufferedBytes
        ByteCounter   =   ByteCounter   +   InputLen

        If   InputLen   > =   lngBufferRemaining   Then
                For   II   =   0   To   lngBufferRemaining   -   1
                        ByteBuffer(lngBufferedBytes   +   II)   =   InputBuffer(II)
                Next   II
                MD5Transform   ByteBuffer
                lngRem   =   (InputLen)   Mod   64
                For   I   =   lngBufferRemaining   To   InputLen   -   II   -   lngRem   Step   64
                        For   J   =   0   To   63
                                ByteBuffer(J)   =   InputBuffer(I   +   J)
                        Next   J
                        MD5Transform   ByteBuffer
                Next   I
                lngBufferedBytes   =   0


        Else
            I   =   0
        End   If
        For   K   =   0   To   InputLen   -   I   -   1
                ByteBuffer(lngBufferedBytes   +   K)   =   InputBuffer(I   +   K)
        Next   K
End   Sub



[解决办法]
帮顶
[解决办法]
接着顶!

热点排行