QString内置64位哈希函数?

7

qHash(const QString&) 返回 32 位的 uint。在 32 位系统上,有没有标准的 Qt 方法可以获得字符串的 64 位哈希值?还是我需要自己实现一个哈希函数?


你为什么想要一个64位的哈希值?是为了更好地避免冲突,还是只是为了填补某个需要64位哈希值的空间?如果你想要避免任何现实可能发生的冲突,我会建议你使用比64位更多的位数:至少使用MD5(如果你不关心安全方面),如果你关心的话可以使用SHA256或其他算法。否则,只需向32位的qHash添加填充位即可。 - hyde
2个回答

9

这是一种实现方式。它是跨平台的,意味着无论平台如何,给定的字符串都会产生相同的哈希值。通过消除对QDataStream的依赖并根据需要使用字节翻转函数来调整字节序,可以进一步优化它。

qint64 hash(const QString & str)
{
  QByteArray hash = QCryptographicHash::hash(
    QByteArray::fromRawData((const char*)str.utf16(), str.length()*2),
    QCryptographicHash::Md5
  );
  Q_ASSERT(hash.size() == 16);
  QDataStream stream(&hash);
  qint64 a, b;
  stream >> a >> b;
  return a ^ b;
}

我会避免使用QDataStream,但除此之外这是一个很好的答案,谢谢。我不知道QCryptographicHash - Violet Giraffe

2

请优先使用内嵌内容而不是链接来回答问题,即使它是一个SE网站。 - László Papp
@LaszloPapp:你所说的内联内容是什么意思?它是一种特殊功能吗? - yshurik
1
@yshurik的意思是在这个页面上总结链接内容,这样可以节省点击次数,并确保答案不会因为链接失效而无效。 - 3ventic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接