javascript – 将CryptoJS的CryptoMD5状态保存为字符串并稍后恢复

我在上传期间逐渐计算大文件的MD5哈希,然后在某些时候我想保存到HTML5 localStorage到目前为止我计算的内容,以便稍后恢复.

据我所知,localStorage可以存储字符串,因此我必须将渐进式MD5值存储为字符串,然后在用户稍后打开浏览器时将其还原.

基本上我的代码看起来像这样:

var md5_full = CryptoJS.algo.MD5.create();

var wordArray = CryptoJS.lib.WordArray.create(chunk);

md5_full.update(wordArray);

此时,我想将md5_full转换为字符串,以便能够保存到localStorage.然后,稍后,当用户想要恢复上传时,能够从localStorage检索md5_full,解除束缚,并继续使用块更新它.

最后我应该能够调用md5_full.finalize();获取最终的完整MD5哈希摘要.

最佳答案
我认为问题可能在于函数序列化–CryoJS显然试图序列化函数,但它可能无法正确恢复引用(范围丢失).

下面的代码通过仅恢复数据而不是函数解决此问题. JSFiddle.

(De)序列化功能

/** Serialize MD5 object. */
function stringify_md5(md5) {
    return JSON.stringify(md5);
}

/** Deserialize MD5 object. */
function parse_md5(serialized_md5) {
    var md5 = CryptoJS.algo.MD5.create();
    restore_data(JSON.parse(serialized_md5),md5);
    return md5;    
}

/** Recursively copy properties from object source to object target. */
function restore_data(source,target) {
    for (var prop in source) {
        var value = source[prop];
        if (typeof value == "object") {
            if (typeof target[prop] != "object") {
                target[prop] = {};
            }
            restore_data(source[prop],target[prop]);
        } else {
            target[prop] = source[prop];
        }
    }
}

用法示例:

var chunk1 = "abc",chunk2 = "def";

// The correct hash:
var md5_full_1 = CryptoJS.algo.MD5.create();
md5_full_1.update(chunk1);
md5_full_1.update(chunk2);
var correct_hash = md5_full_1.finalize();

// Using stringify/parse
var md5_full_2 = CryptoJS.algo.MD5.create();
md5_full_2.update(chunk1);
var md5_serialized = stringify_md5(md5_full_2); // serialize
md5_full_2 = parse_md5(md5_serialized);  // deserialize
md5_full_2.update(chunk2);
var result_hash = md5_full_2.finalize();

alert(correct_hash.toString() == result_hash.toString()); // true

(出于某种原因,使用WordArray在CryptoJS中抛出了一个错误)

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...