Такая вещь, как алгоритм хеширования дайджеста постоянного качества (переменный бит)?

Проблемное пространство: у нас есть тонна данных для обработки, размер которых может варьироваться на 6 порядков. Ищете способ быть более эффективным и, таким образом, использовать меньше места на диске для хранения всех этих дайджестов.

Поэтому я думал о кодировании звука с потерями, таком как MP3. Есть два основных подхода — постоянный битрейт и постоянное качество (он же переменный битрейт). Поскольку меня в первую очередь интересует качество, я обычно выбираю VBR. Таким образом, для достижения того же уровня качества чистый синусовый тон потребует значительно более низкого битрейта, чем что-то вроде сложного классического произведения.

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

Я попытался поискать что-нибудь подобное в межтрубных пространствах. Самое близкое, что я нашел, была публикация где-то, в которой говорилось об использовании хэша дайджеста фиксированного размера, такого как SHA256, в качестве вектора инициализации для AES/CTR, действующего как псевдослучайный генератор. Затем отнимите первое число бит x от этого.

Это кажется вполне выполнимой задачей. Единственная проблема с этим подходом заключается в том, что я понятия не имею, как вычислить соответствующее значение x в зависимости от размера фрагмента данных. Я думаю, что моим целевым качеством будет статистическая невероятность коллизии SHA256 между двумя фрагментами данных размером 1 ГБ. У кого какие мысли по этому расчету?

Существуют ли какие-либо существующие алгоритмы хеширования дайджестов, которые уже делают это? Или есть какие-то другие подходы, которые дадут тот же результат?

Обновление: похоже, существует «губка» SHA3 Keccak, которая может выводить произвольное количество бит. Но мне все еще нужно знать, сколько бит мне нужно в зависимости от размера входных данных для постоянного качества. Звучало так, как будто этот алгоритм создает бесконечный поток битов, и вы просто усекаете столько, сколько хотите. Однако при тестировании в Ruby я ожидал, что первая половина SHA3-512 будет точно равна SHA3-256, но это не так...


person DCameronMauch    schedule 04.03.2015    source источник


Ответы (2)


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

Но ключевым фактором риска коллизий является размер входных данных, набор которых равен размеру хеш-дайджеста. При использовании качественной хэш-функции вероятность конфликта для двух файлов размером 1 ТБ существенно не отличается от вероятности конфликта для двух файлов размером 1 КБ или даже одного файла размером 1 ТБ и одного файла размером 1 КБ. Это связано с тем, что хэш-функция стремится к однородности; хорошие функции достигают этого в высокой степени.

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

Принцип [pigeonhole] можно использовать для доказательства того, что любой алгоритм сжатия без потерь, при условии, что он уменьшает некоторые входные данные (как следует из названия сжатия), также увеличивает некоторые другие входные данные. В противном случае набор всех входных последовательностей до заданной длины L можно было бы преобразовать в (намного) меньший набор всех последовательностей длины меньше L и сделать это без коллизий (поскольку сжатие выполняется без потерь), что позволяет классифицировать Принцип исключает.

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

введите здесь описание изображения

Источник: preshing.com

В верхней строке таблицы указано, что для того, чтобы иметь 50%-ную вероятность коллизии с 32-битной хеш-функцией, вам нужно всего лишь хешировать 77 000 элементов. Для 64-битной хэш-функции это число возрастает до 5,04 миллиарда при том же 50%-м риске коллизий. Для 160-битной хеш-функции вам потребуется 1,42 * 1024 входных данных, прежде чем появится 50%-ная вероятность того, что новый вход будет иметь тот же хэш, что и предыдущий вход.

Обратите внимание, что 1,42 * 1024 160-битных чисел сами заняли бы неоправданно много места; миллионы терабайт, если я правильно рассчитываю. И это без учета 1024 значений элементов, которые они представляют.

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

Однако независимо от того, какую стратегию хеширования вы выберете, существует ненулевой риск столкновения. Любой тип системы идентификации, основанный на хэше, должен иметь резервное сравнение. Простая дополнительная проверка файлов — сравнение их размеров (хорошо работает для любых данных переменной длины, длина которых известна, например строк). В Википедии описано несколько различных стратегий предотвращения и обнаружения конфликтов для хеш-таблиц, большинство из которых можно расширен до файловой системы с небольшим воображением. Если вам требуется идеальная точность, то после того, как у вас закончатся быстрые проверки, вам нужно вернуться к самому простому компаратору: дорогостоящей побитовой проверке двух входов.

person Patrick M    schedule 04.03.2015

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

Предположим, вы уже хэшировали N элементов (без коллизий) и используете 64-битный хеш-код.

Следующий элемент, который вы хешируете, будет принимать одно из 2^64 значений, поэтому у вас будет N / 2^64 вероятность коллизии хэшей при добавлении следующего элемента.

Обратите внимание, что эта вероятность НЕ зависит от исходного размера элемента данных. Это зависит от общего количества элементов, которые вы должны хэшировать, поэтому вы должны выбрать количество битов в соответствии с вероятностью, которую вы готовы допустить хеш-коллизии.

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

Например, предположим, что вы используете диски емкостью 1 ТБ для хранения элементов, и все элементы > 1 ГБ находятся на одном диске, а элементы размером ‹1 КБ — на другом, а третий используется для промежуточных размеров. На первом диске будет не более 1000 элементов, поэтому вы можете использовать меньший хэш, в то время как на диске может быть миллиард элементов с небольшими файлами, поэтому больший хеш будет подходящим для той же вероятности коллизий.

В этом случае размер хеша действительно зависит от размера файла, но только косвенно, в зависимости от размера разделов.

person Peter de Rivaz    schedule 04.03.2015
comment
Я понимаю, что вы говорите. Но я не уверен, что размер совершенно не имеет значения. Также обратите внимание, я говорю о сравнении дайджеста двух файлов примерно одинакового размера. - person DCameronMauch; 04.03.2015
comment
Я обновил, чтобы добавить мысли о том, сравниваете ли вы файлы одинакового размера. - person Peter de Rivaz; 04.03.2015
comment
Пожалуйста, проверьте, следует ли вам эта логика: я предполагаю, но почти уверен, что я прав, говоря, что вполне вероятно, что две разные случайные однобайтовые строки будут генерировать один и тот же SHA256, это полностью невозможно (проверено) . Теперь, если вы продолжите увеличивать размер строк, в какой-то момент строки станут достаточно большими, чтобы они, по крайней мере, могли иметь один и тот же SHA256. Если SHA256 имеет 128-битную защиту, означает ли это, что строки должны быть длиной 2 ^ 120 байт, прежде чем это вообще может произойти? - person DCameronMauch; 04.03.2015
comment
Если вы разрешите полный алфавит ASCII (т. е. каждый символ может принимать любое из 256 значений в байте), то должны быть две строки длиной 33 символа с одним и тем же хэшем SHA256 (поскольку существует 256^33 вариантов строки длиной 256). что больше, чем общее количество возможных выходных хэшей 2^256). Однако, хотя мы знаем, что коллизия должна существовать, насколько мне известно, никто еще не нашел ее для SHA256. Итак, то, что вы говорите, правильно, за исключением того, что первые строки, которые сталкиваются, вероятно, имеют длину ~ 32 байта, а не 2 ^ 120 байтов. - person Peter de Rivaz; 05.03.2015