Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

It's not surprising, and it is not peculiar to FNV-1a. Most of these hashes will exhibit this same behavior.

Since the hash iterates over the characters in the string, once you find two colliding strings S and T, if you append any other string to both S and T, the hashes of S' and T' will also be identical. Try it yourself:

    #include <stdio.h>
    #include "hash_32a.c"
    int main(int argc, char* argv[])
    {
        const char* s[] = {
            "altarage",
            "zinke",
            "altarage_foo",
            "zinke_foo",
            "altarage_xyzzy",
            "zinke_xyzzy"
        };
        int i;
        for (i = 0; i < sizeof s / sizeof (char*); ++i)
        {
            Fnv32_t x = fnv_32a_str(s[i], FNV1_32A_INIT);
            printf("%s: %08x\n", s[i], x);
        }
    }


    $ ./test_fnv1a
    altarage:       e460d8b6
    zinke:          e460d8b6
    altarage_foo:   3d8619c5
    zinke_foo:      3d8619c5
    altarage_xyzzy: 2a6373cf
    zinke_xyzzy:    2a6373cf


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: