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

时间:2014-06-06 23:10:12

标签: javascript cordova sha1 cordova-3 cryptojs

我正在尝试使用sha1哈希作为检查文件更改的方法,问题是当尝试计算更大文件的哈希值(50-100MB)时,应用程序会抛出致命异常,因为它内存不足

版本信息:

  • Cordova 3.5
  • Android 4.2.2
  • Galaxy Tab 2
  • org.apache.cordova.file 1.1.0
  • CryptoJS最新?
  • lib-typedarrays(CryptoJS模块)最新?
  • qjs latest

以下是我正在使用的内容:

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有一个大文件而不会耗尽应用程序中的内存?

1 个答案:

答案 0 :(得分:2)

我能够通过添加

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

<application />标记

中的AndroidManifest.xml中
<application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name" android:largeHeap="true">