Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Gerd Stolpmann <info@gerd-stolpmann.de>
To: Christophe Raffalli <Christophe.Raffalli@univ-savoie.fr>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] ocaml defaut hash ?
Date: Sat, 23 Apr 2016 19:22:18 +0200	[thread overview]
Message-ID: <1461432138.26469.178.camel@e130.lan.sumadev.de> (raw)
In-Reply-To: <20160423154132.GB1455@delli7.univ-savoie.fr>

[-- Attachment #1: Type: text/plain, Size: 3203 bytes --]

Am Samstag, den 23.04.2016, 17:41 +0200 schrieb Christophe Raffalli:
> On 16-04-23 13:21:40, Gerd Stolpmann wrote:
> > Am Samstag, den 23.04.2016, 11:16 +0200 schrieb Christophe Raffalli:
> > > By the way what I really need is a hash function for arrays that I can
> > > update when I update one entry in the array.  Does anyone known of
> > > such a hash function ?
> >
> > It would have to be commutative then (you need to remove the old version
> > and add the new one, for any element for the array). You could use XOR
> > or + of the hashes of the individual elements.
> 
> Hello,
> 
> xor or + was not enough and it does not have to be commutative.

Well, you need to be able to "subtract" the hash of the old version
somehow from the aggregate hash. Well, algebra was a long time ago.

> I tried
> 
> let hash_array a =
>   let r = ref 0 in
>     Array.iteri (fun i x -> r := !r lxor Hashtbl.hash (i,x)) a;
>       !r
> 
> Which works not to bad ... but some small hash value (below 10, after
> moduli) seems to come too often ...

Instead of (i,x) you could also use any function of these. If you can
spend some RAM: Let's rnd(i) the i-th random number of a memorized
sequence. The hash of the i-th element is then hash(rnd(i)*x). You could
also use another operation instead of * but multiplication is fairly
cheap, and "mangles" already a lot. If you want to spend more time,
hash(rnd(i)*x mod p) for a large prime p (instead of the implicit
modulus 2^31/2^63), because the set of values is largest with a primal
modulus.

> > If this doesn't work good enough, I'd try to define larger hash blocks.
> > E.g. consider 4 consecutive elements as a block, and compute the hash of
> > the block, and take the XOR of all blocks you have.
> 
> This is already done. My array is in fact a packed array of values that
> can be represented on few bits, implemented cleanly via a functor.
> 
> The property I would like if you think that the array is a 2 dimensional bitmaps are
> - the hash changes when any bit changes
> - the hash changes for all (most) translation at angle multiple of pi/4
> with zéro padding (making xor no sufficient)

I think when you make the element hash dependent on the position i you
get exactly this property, even with xor.

Gerd

> - covering all range of caml integer as usual
> 
> 
> > Quality depends a
> > little bit on what is in the elements.
> >
> > Gerd
> > --
> > ------------------------------------------------------------
> > Gerd Stolpmann, Darmstadt, Germany    gerd@gerd-stolpmann.de
> > My OCaml site:          http://www.camlcity.org
> > Contact details:        http://www.camlcity.org/contact.html
> > Company homepage:       http://www.gerd-stolpmann.de
> > ------------------------------------------------------------
> >

-- 
------------------------------------------------------------
Gerd Stolpmann, Darmstadt, Germany    gerd@gerd-stolpmann.de
My OCaml site:          http://www.camlcity.org
Contact details:        http://www.camlcity.org/contact.html
Company homepage:       http://www.gerd-stolpmann.de
------------------------------------------------------------


[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 473 bytes --]

      reply	other threads:[~2016-04-23 17:22 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-23  9:16 Christophe Raffalli
2016-04-23 11:21 ` Gerd Stolpmann
2016-04-23 15:41   ` Christophe Raffalli
2016-04-23 17:22     ` Gerd Stolpmann [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1461432138.26469.178.camel@e130.lan.sumadev.de \
    --to=info@gerd-stolpmann.de \
    --cc=Christophe.Raffalli@univ-savoie.fr \
    --cc=caml-list@inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox