Re: Hash/permutation function for object ID creation



On Jul 29, 6:16 pm, matt.timmerm...@xxxxxxxxx wrote:
On Jul 29, 4:20 am, Bruza <benr...@xxxxxxxxx> wrote:

I need a system to generate a series of "semi-random-non-repeating"
32-bit object IDs. For this, I plan to create a sequence counter
(starting from 0), then feed the sequence number, s, to a permutation
function, F(s). And use F(s) as the generated object ID. F() needs to
have the following properties:

1. F(x) is semi-random so that if the ID is partitioned into any
number of "buckets" (by equal range, or MOD hashing), each bucket
has roughly same number of objects.
2. F() has an inverse F' s.t. F(F'(x)) = x
3. Both F() and F'() are computationally "inexpensive" to compute

When I have to do this sort of thing for a simple hash table or
something, I usually do something simple like:

hash = ID+SOME_CONSTANT
hash *= SOME_ODD_CONSTANT
hash ^= (hash>>16)
hash ^= (hash>>8)

each line is reversible in modular arithmetic (mod 2^x), so the whole
function is reversible.

If you need something stronger, you can divide the ID into two halves
(L,R), and with a good hash function H(), do:

L' = L XOR H(R)
R' = R XOR H(L')

hash = (L',R')

This is called a Feistel network (googlable), and again each step is
obviously reversible.

Cheers,

Matt

Matt,

Great! Feistel network seems to be what I want. Thanks for your help.

Bruza
.



Relevant Pages