NodeJS加密 - 哈希n次?

时间:2016-12-16 14:01:45

标签: javascript node.js encryption hash

我需要在NodeJS中散列哈希值(H(H(H(...))大约100到000次我已经提出了三个解决方案,但它们每个都有问题。

任何人都可以提出一个不慢,崩溃或阻塞的解决方案吗? - 最好不要说线程,但我对此持开放态度。

注意:这更像是一个javascript / NodeJS问题,然后是一个加密的

第一个是最快的,但阻止了232毫秒,所以没有好处。

hash = function(data, n)
{
    return new Promise((resolve,reject) => {
        if(data === undefined || n < 1) resolve(false);

        while(n--)
        {
            //console.log('iteration', n, data)
            let hash = crypto.createHash('sha256');
            hash.update(data);
            data = hash.digest();
        }
        resolve(data)

    }).catch(err=>{return err})
}

下一个包含两个解决方案(2&amp; 3),唯一的区别是单行代码。一个溢出堆栈,另一个非常慢,如评论。

hash = function(data, n)
{
    return new Promise((resolve,reject) => {
        if(data === undefined || n < 1) resolve(false);

        (function it() {
            //console.log('iteration', n, data)
            let hash = crypto.createHash('sha256');
            hash.on('readable', () => { 
                let t = hash.read();
                if(t == null) return;
                data = t;
                hash.read();
                if(--n > 0) {
                    //2. gets me to n=100000 but n=10000 takes 15 seconds!!!
                    setTimeout(it, 0) 

                    //3. Very fast but Maximum call stack size exceeded when 
                    //   n=641 so no good and I'm not going to increase the 
                    //   limit just to force it.
                    //it();
                } else {
                    resolve(data);
                }
            });
            hash.write(data);
            hash.end();
        })();
    }).catch(err=>{return err})
}

0 个答案:

没有答案