QCryptographicHash为相同的字符串提供不同的结果

时间:2014-06-16 09:06:08

标签: c++ qt md5

我有一个带有特殊符号的QString(捷克变音符号等)。我想在Qt中计算这个字符串的校验和,所以我这样做:

QString createChecksum(QString str) {
  return QString(QCryptographicHash::hash(str.toLatin1(), QCryptographicHash::Md5).toHex());
}

如果我使用cout打印str.toLatin1()。data(),我总是得到:

  

roleadminmanageroperatorservicemanname10password10created16last_login16removable1last_iso_template10last_pcr_template10last_measurement10last_analysis10last_std_curve100k1Fk1F140290845145014029084514500

但是,对于此字符串,上面提到的代码给出了不同的结果(每个数字对应于createCheckSum的一个特定运行):

  

0x1e42da8 0x1e454a8 0x1e45438 0x1e45378 0x1e41678 0x1e49b58 0x1e49998

当我将字符串放入online md5 tool时,我总会得到相同的结果:

  

6ac41fe9d5338d8aa7f7fb5027e2cdd2

2 个答案:

答案 0 :(得分:3)

toHex只能返回字母0-9和a-f。您获得的内容(0x1e42da8)无法通过此代码生成。请显示您的实际输出声明。您似乎打印出一些指针而不是实际数据,并且指针在重新启动时往往是随机的。

此外,如果您的字符串可以包含特殊符号,则绝对不应使用toLatin1(),因为Latin1编码中不存在的所有符号都将丢失。您应该使用QString::toUtf8()或使用QTextCodec进行所需的编码,以便将QString转换为QByteArray

答案 1 :(得分:1)

而不是

return QString(QCryptographicHash::hash(str.toLatin1(), QCryptographicHash::Md5).toHex());

尝试

return QString(QCryptographicHash::hash(str.toUtf8(), QCryptographicHash::Md5).toHex());