【问题标题】:QCryptographicsHash gives different results for same stringQCryptographicHash 为相同的字符串给出不同的结果
【发布时间】:2014-08-06 01:32:50
【问题描述】:

我有一个带有特殊符号(捷克变音符号等)的 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_curve100�k��1����F������k��1����F������140290845145014029084514500

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

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

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

6ac41fe9d5338d8aa7f7fb5027e2cdd2

【问题讨论】:

  • 您是按原样复制 � 符号,还是使用适当的字符集?
  • 是的,我已经“按原样”复制了它们。这些正是我在控制台中看到的或者我粘贴到该校验和生成器的内容
  • 您可以尝试将字符串写入文件并使用(好的)文本编辑器查看它。根据您的系统,您的控制台可能不支持 unicode 或 utf8 输出。这至少为您提供了一个更好的比较开始
  • 你可以尝试使用不带特殊符号的校验和函数,看看输出是否仍然不同,可能问题出在编码上
  • 是的,你是对的,问题在于编码。所以我的问题是如何计算 QString 关于编码的 MD5SUM?

标签: c++ qt md5


【解决方案1】:

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

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

【讨论】:

  • 谢谢,你是对的。首先是使用 Utf8 而不是 Latin1 编码。其次,我将结果转换为 wstring,这就是废话“0x1e42da8”的来源。
【解决方案2】:

代替

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

试试

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多