我有一个带有特殊符号的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
答案 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());