gpt4 book ai didi

c++ - Qt5 哈希函数不会在 Windows 7 和 Windows 10 上返回相同的哈希值

转载 作者:行者123 更新时间:2023-11-30 04:42:30 24 4
gpt4 key购买 nike

我想散列给定的字符串,然后在多个平台和操作系统上验证散列码。我刚刚在 Qt 5.12 中制作了这个简单的功能。我使用 Windows 10 64 位作为开发机器。

void hashCheckFunction(QString input)
{

QByteArray ba;
const char *str = input.toStdString().c_str();
ba.append(str);

QByteArray md5Ba=QCryptographicHash::hash(ba,QCryptographicHash::Md5).toHex();
QString md5hash(md5Ba);
qDebug()<<"MD5 : "<<md5hash;

QByteArray shaBa=QCryptographicHash::hash(ba,QCryptographicHash::Sha256).toHex();
QString sha256hash(shaBa);
qDebug()<<"SHA 256 : "<<sha256hash;
}

这就是我使用该功能的方式。

hashCheckFunction("JXTSLRCQKFLBZBTWRRRR0.190hello world!cute");

Windows 7 上的输出:

MD5 : 7fc56270e7a70fa81a5935b72eacbe29

SHA256 : 559aead08264d5795d3909718cdd05abd49572e84fe55590eef31a88a08fdffd

Windows 10 上的输出:

MD5 : 4eb30b25e43174eabe0e13426716ef40

SHA256:a5e37a6bfb24ca261cfa91ed5fb73a89a652164c43cd4f7a99147d18d4508eaf

注意:

  1. Windows 10 上的输出是正确的,因为 Windows 10 输出与我的 PHP 脚本生成它在 Linux 服务器上运行。我有验证 Windows 10 生成的哈希与 Linux 上的 PHP 相同服务器。我这样做只是为了检查哪个是正确的。
  2. 对于许多字符串输入,Windows 7 和 Windows 10 上的输出也是相同的。这上面的字符串示例是一个特定的例子,其中相同的函数生成不同的哈希码。

问题:为什么我在 Windows 7 机器上得不到类似于 Windows 10 的相同哈希值?解决方案是什么?

最佳答案

input.toStdString() 构造一个临时的 std::string,它只保证在它所在的语句的持续时间内存在。然后,您使用 .c_str() 获取此临时变量的地址并将其传递给 ba.append()

在这两个事件之间,临时字符串被释放,刚刚释放的内存可能发生任何事情。如果它能在 Windows 7 上运行,那完全是偶然的。

一个更结构化的解决方案是直接构造QByteArray,如下所示:

QByteArray ba = input.toUtf8();

这仍然会创建一个临时对象,但是 QByteArray 赋值运算符将确保将内存复制到 ba(或移动,具体取决于您的 Qt 版本)。

关于c++ - Qt5 哈希函数不会在 Windows 7 和 Windows 10 上返回相同的哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58707164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com