Хеш-функции обычно пишутся для равномерного распределения данных по всем сегментам результатов.
Если вы предполагаете, что ваши файлы равномерно распределены по фиксированному диапазону доступных размеров, допустим, что для ваших файлов существует только 1024 (2 ^ 10) равномерно распределенных разных размера. Хранение размера файла в лучшем случае только уменьшает вероятность коллизии на количество файлов разных размеров.
Примечание: мы могли бы предположить, что это 2 ^ 32 равномерно распределенных и отличных размеров, и это все еще не меняет остальную часть математики.
Общепринято, что общая вероятность столкновения на MD5 (например) равна 1/(2^128)
.
Если не существует чего-то, что специально встроено в хеш-функцию, которая говорит об обратном. Для любого действительного X
, такого, что вероятность P(MD5(X) == MD5(X+1))
остается такой же, как и для любых двух случайных значений {Y
, Z
} То есть, P(MD5(Y) == MD5(Z))
= P(MD5(X) == MD5(X+1))
= 1/(2^128)
для любых значений X
, Y
и Z
.
Объединение этого с 2 ^ 10 различных файлов означает, что, сохраняя размер файла, вы максимально получаете дополнительные 10 битов, которые указывают, отличаются ли элементы или нет (опять же, это предполагает, что ваши файлы равномерно распределены по всем значениям) .
Таким образом, в лучшем случае все, что вы делаете, - это добавление еще N байтов памяти для уникальных значений на сумму <= N байтов (никогда не может быть> N). Поэтому гораздо лучше увеличивать количество байтов, возвращаемых вашей хеш-функцией, используя что-то вроде SHA-1/2, поскольку это с большей вероятностью даст вам равномерно распределенные данные значений хеш-функции, чем сохранение размера файла.
Короче говоря, если MD5 недостаточно хорош для коллизий, используйте более сильный хеш, если более сильные хеши слишком медленные, тогда используйте быстрый хеш с низкой вероятностью коллизий, таких как MD5, а затем используйте более медленный хеш, такой как SHA-1 или SHA256, чтобы уменьшить вероятность столкновения, но если SHA256 достаточно быстр и удвоенный пробел не является проблемой, вам, вероятно, следует использовать SHA256.