Практически любой алгоритм, который вы можете придумать, будет соответствовать вашим критериям. Э.Г.
CHECKSUM = SUM( i=0 .. input.length, input[i] )
чтобы сделать его "плохим-безопасным"
CHECKSUM = 'A' + SUM( i=0 .. input.length, input[i] ) MODULO 26
Попытка уменьшить количество коллизий путем увеличения выходного домена
# Assume BASE64[ ] is the safe output alphabet array.
TMP = SUM( i=0 .. input.length, input[i] ) MODULO 2^24
FOR I = 0..3
CHECKSUM[I] = BASE64[TMP MODULO 64]
TMP = TMP / 64
Решение, которое дополнительно уменьшает количество столкновений путем вычисления различных значений для разных перестановок
# Assume BASE64[ ] is the safe output alphabet array.
TMP = SUM( i=0 .. input.length, i*input[i] ) MODULO 2^24
FOR I = 0..3
CHECKSUM[I] = BASE64[TMP MODULO 64]
TMP = TMP / 64
В общем, все эти вариации работают довольно хорошо, если ввод достаточно случайный и достаточно разреженный (конечно, «достаточно» отличается в каждом случае)