Skip to content

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.

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information