【问题标题】:Different results from MD5 libraries来自 MD5 库的不同结果
【发布时间】:2020-03-17 19:44:25
【问题描述】:

我需要使用 MD5 对一些数据进行哈希处理。我想测试不同库的性能。但是,我注意到我得到了相同数据的不同哈希值,具体取决于所使用的库:

Generating data...

Hashing data with 'md5' library...
         Hash: 1b37c84ebc8426e19d3b1797b6e320c6
         Duration: 0.848s

Hashing data with 'object-hash' library...
         Hash: f046296e8016b5632e6a1d1ebc885892
         Duration: 0.032s

Hashing data with 'create-hash' library...
         Hash: 1b37c84ebc8426e19d3b1797b6e320c6
         Duration: 0.023s

我本来希望两个库都显示相同的哈希值。有任何想法吗?我的代码在下面...

const generateData = () => {
    console.log('Generating data...')
    let data = "";
    for (let i = 0; i < 1000000; i++) {
        data += "1234567890";
    }
    console.log()    
    return data;
}

const convertToUInt8Array = (s) => {
    var result = [];
    for(var i = 0; i < s.length; i+=2)
    {
        result.push(parseInt(s.substring(i, i + 2), 16));
    }
    result = Uint8Array.from(result)
    return result;
}

const hashData = (name, hashingFunction, data) => {
    console.log(`Hashing data with '${name}' library...`)
    const start = new Date()
    const hash = hashingFunction(data)
    const end = new Date()
    console.log(`\t Hash: ${hash}`)
    const duration = (end - start) / 1000
    console.log(`\t Duration: ${duration}s`)
    console.log()
}

const hashWithMD5 = (data) => {
    const md5 = require('md5')
    return md5(data)
}

const hashWithObjectHash = (data) => {
    const objectHash = require('object-hash')
    return objectHash.MD5(data)
} 

const hashWithCreateHash = (data) => {
    const createHash = require('create-hash')
    const hash = createHash('md5')
    hash.update(data)
    return hash.digest('hex')
}

const data = generateData()
hashData('md5', hashWithMD5, data)
hashData('object-hash', hashWithObjectHash, data)
hashData('create-hash', hashWithCreateHash, data)

【问题讨论】:

  • 您可以尝试将编码选项传递给 objectHash.MD5 函数,例如:return objectHash.MD5(data, {encoding: 'hex'})

标签: node.js npm hash md5


【解决方案1】:

object-hash 散列对象,而不是字符串值。 implementation 前置

'string:' + string.length + ':'

到输入字符串并对其进行 MD5 散列。您可以通过修改hashWithCreateHash 来生成相同输入的哈希来确认这一点:

const hashWithCreateHash = (data) => {
    const createHash = require('create-hash')
    const hash = createHash('md5')
    hash.update(`string:${data.length}:${data}`) // instead of hash.update(data)
    return hash.digest('hex')
}
Hashing data with 'create-hash' library...
         Hash: f046296e8016b5632e6a1d1ebc885892
         Duration: 0.023s

【讨论】:

  • 真烦人!谢谢!
  • @ThisRestlessPilgrim 好吧,如果你想将某些东西作为 md5 进行散列,你不应该期望每个人都使用相同的散列 - 所以搜索一个 md5 库,而不是一些随机散列库。
  • @ThisRestlessPilgrim 请记住,速度并不是最重要的。不阻塞事件循环但耗时稍长的异步实现比在执行期间阻塞的实现更可取。
  • 我一直在寻找 md5 的替代品,因为当我通过它发送大文件时,它的内存使用会爆炸。有什么建议吗?
  • 顺便说一句,我刚刚提出了一个您可能知道答案的相关问题:stackoverflow.com/questions/58982969/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-28
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多