compiler/cclasses.pas: replace DJB2 with MurmurHash3
MurmurHash3 is considerably faster even on small strings, much better (see images here), and not much more complex.
It is public domain.
Patch: murmur3.patch.
My measurements with -O4
:
x86-32 x86-64
DJBHash len 3 2.97 ns <- 4.09 ns (-20.9%)
Murmur3 len 3 3.16 ns (-6.53%) 3.38 ns <-
DJBHash len 4 3.81 ns (-26.6%) 4.12 ns (-40.1%)
Murmur3 len 4 3.01 ns <- 2.94 ns <-
DJBHash len 5 3.99 ns (-13.7%) 4.46 ns (-42%)
Murmur3 len 5 3.51 ns <- 3.14 ns <-
DJBHash len 6 4.26 ns (-17.3%) 4.52 ns (-26.6%)
Murmur3 len 6 3.63 ns <- 3.57 ns <-
DJBHash len 7 5.21 ns (-37%) 5.45 ns (-34.5%)
Murmur3 len 7 3.81 ns <- 4.05 ns <-
DJBHash len 24 13.3 ns (-70.8%) 13 ns (-74.7%)
Murmur3 len 24 7.77 ns <- 7.45 ns <-
DJBHash len 25 13.8 ns (-63.2%) 13.5 ns (-70.9%)
Murmur3 len 25 8.43 ns <- 7.88 ns <-
DJBHash len 26 14.3 ns (-69%) 14.1 ns (-78.6%)
Murmur3 len 26 8.46 ns <- 7.88 ns <-
DJBHash len 27 14.8 ns (-73%) 14.6 ns (-76.7%)
Murmur3 len 27 8.53 ns <- 8.26 ns <-
-O1
is, roughly saying, similar.
As a copy-paste of FPHash()
, TStringHelper.GetHashCode()
can be redone the same way.