2010-03-14 2 views
8

Я хэширую большое количество файлов, и, чтобы избежать хеш-коллизий, я также сохраняю исходный размер файла - таким образом, даже если есть хеш-столкновение, крайне маловероятно, что размер файла также будет идентичным. Является ли этот звук (вероятность столкновения с хэшем одинаково вероятна любого размера), или мне нужна еще одна информация (если вероятность столкновения также будет такой же, как и у оригинала).Являются ли хэш-коллизии с разными размерами файлов такими же вероятными, как размер файла?

Или, в более общем смысле: Является ли каждый файл столь же вероятным, чтобы создать конкретный хеш, независимо от исходного размера файла?

+0

как хеширование? ша-1? – bmargulies

+0

@bmargulies: Я полагаю, что я прошу в целом, но в настоящее время я использую SHA1, учитывая переход на что-то вроде SHA256. Мне просто интересно, как долго нужен хеш, если я также определяю размер файла. – SqlRyan

+0

У меня была такая же идея. Нам нужны хэш-файлы, но нам нужна максимальная скорость (т. Е. MD5), и файлы сильно различаются по размерам. Если можно получить один и тот же MD5-хэш на двух разных размерах файлов, то, возможно, стоит сохранить как размер MD5 + для дополнительного уровня безопасности. Мы хешируем через миллионы (может быть, даже миллиард) файлов, поэтому в нашем случае это может стоить в том числе размер файла. – Brain2000

ответ

4

Зависит от вашей хеш-функции, но в общем случае файлы с одинаковым размером, но с различным контентом, с меньшей вероятностью выдают тот же хеш, что и файлы разного размера. Тем не менее, вероятно, было бы проще просто использовать проверенный временем хэш с большим пространством (например, MD5 вместо CRC32 или SHA1 вместо MD5), чем делать ставки на собственные решения, такие как сохранение размера файла.

+0

Я рассматривал использование хеша в сочетании с размером файла - таким образом, в случае маловероятного даже столкновения, я бы проверял размер файла в качестве дополнительного ключа, чтобы убедиться, что это действительно тот же файл. – SqlRyan

+1

Я понимаю, к чему вы стремились, но я хочу сказать, что вместо того, чтобы брать дополнительные N бит для хранения файла, вам нужно просто взять хеш-функцию, чей хэш - это N бит больше, чем ваш текущий. Таким образом, гораздо чаще возникает меньше конфликтов, поскольку размер файла произволен, а хеш-функции специально разработаны для предотвращения столкновений, поэтому эти дополнительные биты будут лучше использоваться таким образом. –

+0

А - это имеет смысл. Я решил, что в любом случае мне лучше выбрать «большую» хеш-функцию, так что, возможно, это то, что я в итоге сделаю. – SqlRyan

1

Хеш-функции сконструированы так, что получить столкновение очень сложно, иначе они не будут эффективными.
Если у вас есть столкновение хэша, то есть абсолютно невероятное около 1: number_of_possible_hashes вероятность, что ничего не говорится о размере файла.

Если вы действительно хотите быть уверенным в хеш-столкновении, вы можете рассчитать два разных хэша для одного и того же файла - он будет менее подвержен ошибкам, чем сохранение хэша + размер файла.

+0

Я действительно подумывал об этом - см. Мой другой вопрос, http://stackoverflow.com/questions/2437345/tracking-unique-versions-of-files-with-hash. Я решил, что сохранение двух хэшей (например, SHA1 и MD5), а также файлов, приведет к столкновениям, поэтому астрономически маловероятно, что мне никогда не придется беспокоиться об этом. – SqlRyan

+0

Предположите, что вы используете sha256, который дает вам 2^256 возможных значений хэша, и у вас есть миллиард файлов с миллионами версий, каждый из которых составляет 1 000 000 000 * 1 000 000, приближающийся к 2^50, так что вы заканчиваете со средним значением 2^200 возможных значений хэша для каждого файла без какой-либо угрозы столкновения. Разве это не огромно? Точнее, вы можете попытаться оценить вероятность столкновения хэшей, вычислив «1 - ((2^256)!/((2^256) - 10^15)!)/((2^256)^(10^15)) 'или если не так точно '1 - (1 - (10^15)/(2 * 2^256))^(10^15)', что даст вам вероятность столкновения 4e-48. – Li0liQ

1

Размер хэша одинаковый независимо от размера исходных данных. Поскольку существует только ограниченное количество возможных хэшей, теоретически возможно, что два файла с разными размерами могут иметь одинаковый хеш. Однако, это также возможно, что два файла с одинаковыми размерами могут иметь одинаковый хэш.

0

Весь смысл семейства криптографических хэшей (MD5, SHA-x и т. Д.) Заключается в том, чтобы столкновения исчезающе маловероятны. Понятие состоит в том, что официальные правовые процессы готовы зависеть от того, что было бы нецелесообразно производить столкновение с целью. Так что, на самом деле, это плохое использование пространства и времени процессора, чтобы добавить пояс к подтяжкам этих хэшей.

7

Хеш-функции обычно записываются для равномерного распределения данных по всем ведрам результатов.

Если вы предполагаете, что ваши файлы распределены равномерно по фиксированному диапазону доступных размеров, скажем, что для ваших файлов равномерно распределены по размеру (равно 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.