On Wed, Aug 4, 2010 at 2:53 AM, Jacob Todd <jaketodd...@gmail.com> wrote:
> In K&R, chapter 6, section 6, there is a funtion called hash that hashes a
> string, which will be stored in a linked list. The function in question is on
> page 144, but here it is for those of you who don't have K&R handy.
>
>        /* hash:  form hash value for string s */
>        unsigned
>        hash(char *s)
>        {
>                unsigned hashval;
>
>                for(hashval = 0; *s != '\0'; s++)
>                        hashval = *s + 31 * hashval;
>                return hashval % HASHSIZE;
>        }
>
> So what is the purpose of the magic 31? The only thing that I think might be a
> reference to what it may be for is the paragraph prior, which states
>
>        The hashing function, ..., adds each character value in the string to a
>        scrambled combination of the previous ones and returns the remainder
>        modulo the array size.
>
> Does the magic 31 have to do with scrambling?
>
It's also worth remembering that K & R was written at a time many
decades ago when performance aspects of computer architecture were a
lot, lot simpler. Apparently they have

#define HASHSIZE 101

which given that there's no really efficient way of computing % for
arbitrary numbers is going to be quite slow (particularly if the
strings are short), which is why hashes for modern machines use table
sizes that avoid needing a mod. (There are other things that are slow
on modern architectures that modern hash functions avoid.) I'd use K&R
for the C syntax and some of the higher level ideas of programming,
but not try to understand good hashing technology from there.

-- 
cheers, dave tweed__________________________
computer vision reasearcher: david.tw...@gmail.com
"while having code so boring anyone can maintain it, use Python." --
attempted insult seen on slashdot

Reply via email to