Внутреннее состояние в unsigned int и char *data -- это ошибки: char бывает знаковым и беззнаковым, а int может иметь разную ширину в зависимости от системы.
Дальше, вы замешиваете входные данные в хэш побайтово, это дыра для дифференциального криптоанализа.
Дальше, состояние вы тащите в интах, а за время хеширования одного байта у вас состояние не прокручивается полностью (ваши сдвиги, максимум на 3, за цикл хеширования сдвинут состояние максимум на 24 бита из 32). Мало того, что это неряшливо, это также значит, что старшие и младшие части слов хеша будут иметь разную структуру.
Короче, даже без углубления в анализ видно, что алгоритм непродуман и слаб.
Правда работает медленно (относительно sha* например).
При том, что даже sha1 делает больше раундов, чем ваше произведение.
если не будет совпадений, то возможно он нормальный
К тому же вам, очевидно, не хватает знаний о том, как оценивается качество криптографических хеш-алгоритмов.