Kristian Kilpi Wrote:

> On Sun, 03 May 2009 15:33:12 +0300, Jérôme M. Berger <[email protected]>  
> wrote:
> > |
> > | foreach(c; str)
> > | {
> > |     ret = (ret << 4) + c;
> > | }
> > |
> >     That one is very bad because it only takes into account the last
> > few characters of the string (how many depends on the size of the
> > hash). However, several hashing algorithms use 2^n+1 as their
> > multiplier, which is very fast even on old/small/embedded hardware
> > because it can be implemented as a shift and an addition.
> 
> You are of course right; thanks for the correction. Lets scrap that  
> algorithm! :)

Would something like

foreach(i, c; str)
{
   ret ^= cast(uint) c;
   if (i & 1)
      ret <<= 1;
}

do a better job. That could cover the first 64 chars reasonably well, and I 
suspect that could cover a lot of use cases.

Reply via email to