QString 的内置 64 位哈希函数?

Posted

技术标签:

【中文标题】QString 的内置 64 位哈希函数?【英文标题】:Built-in 64-bit hash function for QString? 【发布时间】:2014-02-24 22:01:27 【问题描述】:

qHash(const QString&) 返回uint,它是 32 位的。是否有任何标准的 Qt 方法可以在 32 位系统上为字符串获取 64 位哈希?还是我必须自己实现一个哈希函数?

【问题讨论】:

为什么需要 64 位哈希?为了更好地避免冲突,或者只是为了在某处填写为哈希保留的 64 位?如果你想避免任何实际的碰撞机会,我会说你想要的不仅仅是 64:MD5 至少(如果你不关心安全方面,SHA256 或其他东西,如果你这样做的话)。否则,只需将填充位添加到 32 位 qHash 【参考方案1】:

这是一种方法。它是跨平台的,因为无论平台是什么,给定的字符串都会产生相同的哈希值。它当然可以通过消除对 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【参考方案2】:

恐怕在 Q​​t 中对于 QStrings 的 64 位散列没有标准方法。 但是,如果您继续自己实现散列,那么研究以下内容是有意义的:https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed,它将为您提供大量关于散列字符串和代码示例的信息。

【讨论】:

请选择内联内容而不是仅链接的答案,即使它是 SE 网站。 @LaszloPapp:内联内容是什么意思?是不是有什么特别之处? @yshurik 他的意思是在此页面上总结链接的内容,这样可以节省人们点击的时间,并确保如果链接断开,答案不会失效。

以上是关于QString 的内置 64 位哈希函数?的主要内容,如果未能解决你的问题,请参考以下文章

从 UTF-8 QString 中提取字节

如何将64位哈希值缩短到48位值?

为啥将地址右移三位作为固定大小哈希表的哈希函数?

Hive的内置HASH()函数使用哪种哈希算法

2.哈希加密 & base64加密

SM3哈希算法