[Development] What's our policy on changing the result of qHash(T, 0) between major releases?

Marc Mutz marc.mutz at qt.io
Mon Feb 5 10:36:39 CET 2024


Hi,

I've always understood it such that we as Qt must preserve the property 
that the hash for equal elements is equal within _one_ run of _one_ 
process. This means you can use the hash in I/O in any way. That's why 
we have qt_hash, which you _can_ (and do) use in I/O (but is private 
API, AFAIK). I never thought that a hash seed of zero would change that, 
but of course users may have come to depend on this (Hyrum's Law), so a 
[ChangeLog] would be in order.

 From that follows that you can change the hash algorithm, provided the 
hash function is out-of-line exported, but you can't if it's inline (or, 
theoretically, non-exported, because some user may have copied the 
implementation into his application or wrote a conflicting one; which is 
why I'd suggest to =delete non-Qt-provided qHash functions: to prevent 
users from writing their own).

HTH,
Marc

On 03.02.24 22:08, Thiago Macieira wrote:
> Requirement: the qHash function in question is and has always been out-of-
> line. We obviously can't change the hashing function of inline code, because
> it may have been inlined.
> 
> When the seed is non-zero, we make no guarantees on what the result will be.
> The result is allowed to change between Qt versions and between machines, even
> for the same seed. Strictly speaking, you're not supposed to pass replay a
> seed, because some hash functions have a hidden seed you can't get or set.
> 
> But what about a zero seed? It's what we call a "deterministic hashing". We
> have changed the algorithms on .0 releases (in both 5.0 and 6.0 for QString).
> 
> The reason I'm asking is that right now
> 
> 	qHash(QLatin1StringView(str)) == qHash(QByteArrayView(str))
> 
> but it would be far more useful to have
> 
> 	qHash(QLatin1StringView(str)) == qHash(QString(str))
> 
> I've made the change for the non-zero seeds, but one couldn't rely on the
> above unless it applied for every seed.f
> 
> 
-- 
Marc Mutz <marc.mutz at qt.io>
Principal Software Engineer

The Qt Company
Erich-Thilo-Str. 10 12489
Berlin, Germany
www.qt.io

Geschäftsführer: Mika Pälsi, Juha Varelius, Jouni Lintunen
Sitz der Gesellschaft: Berlin,
Registergericht: Amtsgericht Charlottenburg,
HRB 144331 B



More information about the Development mailing list