Хеш-функции обычно записываются для равномерного распределения данных по всем ведрам результатов.
Если вы предполагаете, что ваши файлы распределены равномерно по фиксированному диапазону доступных размеров, скажем, что для ваших файлов равномерно распределены по размеру (равно 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.
как хеширование? ша-1? – bmargulies
@bmargulies: Я полагаю, что я прошу в целом, но в настоящее время я использую SHA1, учитывая переход на что-то вроде SHA256. Мне просто интересно, как долго нужен хеш, если я также определяю размер файла. – SqlRyan
У меня была такая же идея. Нам нужны хэш-файлы, но нам нужна максимальная скорость (т. Е. MD5), и файлы сильно различаются по размерам. Если можно получить один и тот же MD5-хэш на двух разных размерах файлов, то, возможно, стоит сохранить как размер MD5 + для дополнительного уровня безопасности. Мы хешируем через миллионы (может быть, даже миллиард) файлов, поэтому в нашем случае это может стоить в том числе размер файла. – Brain2000