Cordova计算大文件的sha1哈希值而不会耗尽内存

Cordova calculate sha1 hash of large file without running out of memory

本文关键字:内存 哈希值 计算 文件 sha1 Cordova      更新时间:2023-09-26

我试图使用sha1哈希作为检查文件更改的一种手段,问题是当试图计算更大文件(50-100MB)的哈希时,应用程序抛出致命异常,因为它耗尽了内存。

版本信息:

    3.5科尔多瓦
  • Android 4.2.2
  • Galaxy Tab 2
  • org.apache.cordova。文件1.1.0
  • CryptoJS最新吗?
  • lib-typedarrays(模块为CryptoJS)最新?
  • qj最新

下面是我使用的:

function _getFileChecksum(file){
    var deferred = Q.defer();
    if(typeof CryptoJS === 'undefined'){
        if(DEBUG){
            console.log('CryptoJS is required.');
        }
        return deferred.reject(new Error('CryptoJS is required.'));
    }
    var reader = new FileReader();
    reader.onload = function (evt) {
        if(DEBUG){
            console.log('_getFileChecksum: reader finished loading');
        }
        var arrayBuffer = evt.target.result;
        var wordArray = CryptoJS.lib.WordArray.create(arrayBuffer);
        var hash = CryptoJS.SHA1(wordArray);
        if(DEBUG){
            console.log('_getFileChecksum: hash = '+hash);
        }
        deferred.resolve(hash);
    };
    reader.onerror = function(anError){
        if(DEBUG){
            console.log('_getFileChecksum: reader error');
        }
        deferred.reject(anError);
    };
    reader.readAsArrayBuffer(file);
    return deferred.promise;
}

现在这对于较小的文件工作得很好。但是当我得到较大的值时,问题就出现了。有人知道我如何计算一个大文件的sha1,而不会在应用程序中耗尽内存吗?

我可以通过添加

来解决内存不足的问题。
android:largeHeap="true"

在我的AndroidManifest.xml在<application />标签

<application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name" android:largeHeap="true">