Node.js缓冲xor意外行为

时间:2018-05-16 21:02:32

标签: node.js xor async.js

情景:

  • 用户上传一个X大小的文件,该文件被分成12个相等的块;如果除法的结果不是无符号整数,我在上限上舍入它,所有的块都将具有相同的长度,除了最后一个

  • 对12个块进行预处理,并创建6个擦除块(4个本地和2个全局),目的是恢复文件;我选择这种方法来减少所需的磁盘大小并优化恢复并添加一些容错

工作方案代码

function erasureChunkCreate(chunks,callback) {
let erasureChunks = {};
let locale = undefined;
let global = undefined;
erasureChunks = {'local': {}, 'global': {}};
async.eachSeries(chunks, (item, callback_times) => {
    if (locale === undefined)
        locale = item.chunk.slice();
    else
        locale = xor(locale, item.chunk);

    if (item.seq_no % 3 === 2) {
        erasureChunks['local'][Math.ceil(item.seq_no / 3)] = locale;
        if (global === undefined)
            global = locale.slice();
        else
            global = xor(global, locale);
        locale = undefined;
    }
    callback_times(null);
}, (err_times) => {
    if (err_times)
        return callback(err_times, null);
    erasureChunks['global'] = global;
    return callback(null, erasureChunks);
});

}

问题:

  • 如果在计算区域设置之后放置全局变量xor我得到下一个意外行为,不同的块哈希

意外情景引导代码部分

    if (locale === undefined)
        locale = item.chunk.slice();
    else
        locale = xor(locale, item.chunk);

    if (global === undefined)
        global = locale.slice();
    else
        global = xor(global, locale);

    if (item.seq_no % 3 === 2) {
        erasureChunks['local'][Math.ceil(item.seq_no / 3)] = locale;
        locale = undefined;
    }

我尝试了什么:

  • 调试并手动检查缓冲区和xor结果,看到2个场景产生不同的xor值
  • 尝试更改代码的逻辑(导致工作方案代码)

使用的模块:

  • async
  • buffer-xor

0 个答案:

没有答案