crc32 вообще не для хеширования придумывалась, а для хоть какой-то проверки целостности данных. Для хеширования её использовать несколько дебильно, хотя некоторые юзают. Сам юзал, пока не накрылся тазом.
А как вообще серьёзные хеш-функции люди придумывают? Какое надо иметь мышление?
Т.е. вот чтобы придумать crc32 надо мыслить так: надо свернуть поток слов (байтов и т.п.) произвольной длины так, чтобы:
1) изменение хотя-бы одного бита в этом потоке меняло контрольную сумму, причём так, чтобы это изменение не совпадало с изменением бита в другом месте потока. Т.е. если какой-то бит меняет контр. сумму на 1, то такое же изменение в другой месте потока не должно давать тот же эффект.
А для хеширования надо думать так:
1) изменение 1 бита в ключе (потоке данных) должно менять результат максимально несвязанно с изменением результата от изменения других битов. В crc32 такого требования нет: там допустимо, чтобы в результатах образовывались «близкие области значений» для некоторых близких входных ключей. Это никого не волнует, пока crc32 вообще отличает разные потоки друг от друга.
А как придумывается алгоритм хеширования? Так же интуитивно, как прочие алгоритмы? Надо просто погрузиться в тему и пытаться что-то сделать, это творческий процесс, как придумывание хитрого замка?