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】:
恐怕在 Qt 中对于 QStrings 的 64 位散列没有标准方法。 但是,如果您继续自己实现散列,那么研究以下内容是有意义的:https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed,它将为您提供大量关于散列字符串和代码示例的信息。
【讨论】:
请选择内联内容而不是仅链接的答案,即使它是 SE 网站。 @LaszloPapp:内联内容是什么意思?是不是有什么特别之处? @yshurik 他的意思是在此页面上总结链接的内容,这样可以节省人们点击的时间,并确保如果链接断开,答案不会失效。以上是关于QString 的内置 64 位哈希函数?的主要内容,如果未能解决你的问题,请参考以下文章