phash2/1 for atoms

Thomas Johnsson <>
Fri Feb 24 17:03:56 CET 2006


erlang:phash2 as expected seems to give a "random" bit sequence for 
terms in general, eg.,

69> erlang:phash2(0).
88723725
70> erlang:phash2(1).
2614250
71> erlang:phash2({}).
87486268
72> erlang:phash2({0}).
84975979
73> erlang:phash2([]).
113427502
74> erlang:phash2([1,2]).
13006701

However, applying phash2 to short atoms does not seem quite so "randomly 
wellbehaved":

57> erlang:phash2(a).
97
58> erlang:phash2(aa).
1649
59> erlang:phash2(aaa).
26481
60> erlang:phash2(aaaa).
423793
61> erlang:phash2(aaaaa).
6780785
62> erlang:phash2(aaaaaa).
108492657
63> erlang:phash2(aaaaaaa).
125269777
64> erlang:phash2(aaaaaaaa).
125268225
65> erlang:phash2(aaaaaaaaa).
125243393
66> erlang:phash2(aaaaaaaaaa).
124846081
67> erlang:phash2(baaaaaaaaa).
124907521
68> erlang:phash2(aaaaaaaaab).
124846082

Is this intentional, or a bug?

Looking at the source in erts/emulator/beam/utils.c in the OTP 
distribution,  it seems that for atoms
       atom_tab(atom_val(term))->slot.bucket.hvalue
is always used, without using the "funny numbers" (HCONST_....) or 
UINT32_HASH.

-- Thomas







More information about the erlang-questions mailing list