2013-05-24 2 views
5

Я постепенно вычисляю хэш большого массива MD5 во время загрузки, а затем в какой-то момент хочу сохранить в HTML5 localStorage то, что я вычислил до сих пор, чтобы быть в состоянии возобновить позже.Сохранение CryptoMD5 CryptoJS в качестве строки и восстановление его позже

Из того, что я знаю, localStorage может хранить строки, поэтому мне нужно сохранить прогрессивное значение MD5 в виде строки, а затем восстановить их, когда пользователь откроет браузер позже.

В основном мой код выглядит следующим образом:

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

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

md5_full.update(wordArray); 

На данный момент, я хочу, чтобы преобразовать md5_full в строку, чтобы иметь возможность сохранить localStorage. И затем, в более позднее время, когда пользователь хочет возобновить загрузку, чтобы получить md5_full от localStorage, неструктурируйте и продолжайте обновлять его кусками.

В конце концов я должен был бы позвонить md5_full.finalize();, чтобы получить окончательный полный хэш-файл MD5.

+0

Пытаюсь использовать https://github.com/hunterloftis/cryo (CryoJs), чтобы подкрепить, а затем проанализировать. Но метод update(), например, его нет в объекте, но мне нужно вызвать md5_full. $ Super. $ Super.update() ... поэтому CryptoJS использует некоторый механизм наследования, который не восстанавливается должным образом – StefanH

+0

код для строкового и парсинга: md5_full_str = Cryo.stringify (md5_full); md5_full_restored = Cryo.parse (md5_full_str); Затем md5_full_restored.update() недоступен, как описано выше. – StefanH

ответ

4

Я думаю, что проблема может быть связана с сериализацией функций - 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 по какой-то причине)

+0

Эй, большое спасибо за ваше решение! Оно работает! – StefanH

Смежные вопросы