2014-02-24 7 views
4

qHash(const QString&)uint이며 32 비트입니다. 32 비트 시스템에서 문자열에 대한 64 비트 해시를 가져 오는 표준 Qt 방식이 있습니까? 아니면 직접 해시 함수를 구현해야합니까?QString을위한 내장 된 64 비트 해시 함수?

+0

왜 64 비트 해시를 원하십니까? 더 나은 충돌을 방지하거나 어딘가에 해시를 위해 예약 된 64 비트를 채우기 위해서? 현실적인 충돌 가능성을 피하려면 최소 64 비트 (보안 측면, 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

QString에는 64 비트 해시를위한 표준 방법이 없습니다. 하지만 직접 해시를 구현하면 다음을 공부하는 것이 좋습니다. https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed 그러면 코드 예제로 문자열 해시에 대한 많은 정보를 얻을 수 있습니다.

+0

위대한 팁, 감사합니다. –

+0

SE 사이트 인 경우에도 링크 전용 답변보다 인라인 콘텐츠를 선호하십시오. – lpapp

+0

@LaszloPapp : 콘텐츠를 인라이닝한다는 것은 무엇을 의미합니까? 그것은 특별한 특징입니까? – yshurik

관련 문제