Ваш пример неверен по моему мнению.
Позвольте мне показать вам, почему:
md5(a) == md5(b)
Когда оба хэша одинаковы, соответствующие строки должны быть одинаковыми (это могут быть коллизии, но это не важно в моей диссертации), поэтому у нас будет:
a = b
Когда вы теперь объедините обе строки со строкой z, у вас будет
a.z = b.z
и их md5-хэши будут одинаковыми, потому что они имеют одинаковый ввод строки
md5(a.z) == md5(b.z)
и хэш md5 в третий раз будет равен, в то время как оба строковых ввода одинаковы
md5(z.a) == md5(z.b)
И это верно для md5 и любого другого алгоритма хеширования, хотя они должны быть детерминированными и не иметь побочных эффектов.
Так что ваш пример будет иметь смысл только тогда, когда z - это специальная строка, которая приведет к столкновению. И поэтому поведение md5 и sha1 будет точно таким же:
Добавленная строка столкновения приведет к столкновению, но с префиксом будут разные хэши (но есть действительно очень малая вероятность того, что вы найдете строку столкновения, которая будет предварительно добавлена и добавит результат при столкновении, но ни одного примера пока не найдено в действительности)
Вы только не нашли другую строку с тем же sha1, потому что столкновения труднее найти, как объяснили люди до меня.