Как сгенерировать md5-хэши для больших файлов с VBA?

У меня есть следующие функции для генерации md5-хэшей для файлов. Функции отлично работают для небольших файлов, но вылетает и генерируетОшибка выполнения 7 - Недостаточно памяти когда я пытаюсь хэшировать файлы размером более ~ 250 МБ (на самом деле я не знаю, в каком именно размере он разбивается, но файлы размером менее 200 МБ работают нормально).

Я не понимаю, почему он ломается в определенном размере, поэтому, если бы кто-то мог пролить свет на это, я был бы очень признателен.

Кроме того, что я могу сделать, чтобы функции обрабатывали большие файлы? Я намерен использовать функции в более крупном инструменте, где мне нужно будет генерировать хэши для файлов неизвестных размеров. Большинство из них будет достаточно маленьким, чтобы работали текущие функции, но мне также придется обрабатывать большие файлы.

Я получил свои текущие функции от наиболее проголосовавших ответ на этот постКак получить шестнадцатеричный хеш MD5 для файла с использованием VBA?

Public Function FileToMD5Hex(ByVal strFileName As String) As String
Dim varEnc           As Variant
Dim varBytes         As Variant
Dim strOut           As String
Dim intPos           As Integer

Set varEnc = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")

'Convert the string to a byte array and hash it
varBytes = GetFileBytes(strFileName)
varBytes = varEnc.ComputeHash_2((varBytes))

'Convert the byte array to a hex string
For intPos = 1 To LenB(varBytes)
   strOut = strOut & LCase(Right("0" & Hex(AscB(MidB(varBytes, intPos, 1))), 2))
Next

FileToMD5Hex = strOut

Set varEnc = Nothing

End Function

Private Function GetFileBytes(ByVal strPath As String) As Byte()
Dim lngFileNum          As Long
Dim bytRtnVal()         As Byte

lngFileNum = FreeFile

'If file exists, get number of bytes
If LenB(Dir(strPath)) Then
   Open strPath For Binary Access Read As lngFileNum
   ReDim bytRtnVal(LOF(lngFileNum)) As Byte
   Get lngFileNum, , bytRtnVal
   Close lngFileNum
Else
   MsgBox "Filen finns inte" & vbCrLf & "Avbryter", vbCritical, "Filen hittades inte"
   Exit Function
End If

GetFileBytes = bytRtnVal
Erase bytRtnVal

End Function

Спасибо

Ответы на вопрос(2)

Ваш ответ на вопрос