2014-02-24 12 views
4

qHash(const QString&)返回uint,这是32位。是否有任何标准的Qt方式获得64位散列的32位系统上的字符串?或者我必须自己实现散列函数?用于QString的内置64位散列函数?

+0

你为什么要64位散列?为了更好地避免冲突,或者只是为了填充64位而保留在某处?如果你想避免碰撞的真实机会,我会说你需要更多的比64位:MD5更少的位(如果你不关心安全性方面的问题,SHA256或其他)。否则,只需将填充位添加到32位'qHash'中即可。 – hyde

回答

4

这是做到这一点的一种方法。它是跨平台的,从某种意义上说,无论平台是什么,给定的字符串都会产生相同的散列。当然可以通过消除对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; 
} 
+0

我会避免QDataStream,但否则这是一个很好的答案,谢谢。我不知道'QCryptographicHash'。 –

2

恐怕Qt中没有用于QStrings的64位散列的标准方法。 但是,如果你继续自己实现散列,那么研究这个是有意义的:https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed这将给你很多关于散列字符串的信息和代码示例。

+0

伟大的提示,谢谢。 –

+0

请选择内联内容而不是仅限链接的答案,即使它是SE网站。 – lpapp

+0

@LaszloPapp:内容的内联是什么意思?它有一些特殊功能吗? – yshurik