Проблемное пространство: у нас есть тонна данных для обработки, размер которых может варьироваться на 6 порядков. Ищете способ быть более эффективным и, таким образом, использовать меньше места на диске для хранения всех этих дайджестов.
Поэтому я думал о кодировании звука с потерями, таком как MP3. Есть два основных подхода — постоянный битрейт и постоянное качество (он же переменный битрейт). Поскольку меня в первую очередь интересует качество, я обычно выбираю VBR. Таким образом, для достижения того же уровня качества чистый синусовый тон потребует значительно более низкого битрейта, чем что-то вроде сложного классического произведения.
Используя ту же идею, два очень маленьких фрагмента данных должны требовать значительно меньше общего количества битов дайджеста, чем два очень больших фрагмента данных, чтобы обеспечить примерно одинаковую статистическую невероятность (то, что я называю качеством в этом контексте) столкновения их дайджестов. Это предположение кажется мне интуитивно правильным, но опять же, я не криптоматематик. Также обратите внимание, что речь идет об идентификации, а не о безопасности. Ничего страшного, если небольшой фрагмент данных имеет небольшой дайджест и, таким образом, его можно воспроизвести с вычислительной точки зрения.
Я попытался поискать что-нибудь подобное в межтрубных пространствах. Самое близкое, что я нашел, была публикация где-то, в которой говорилось об использовании хэша дайджеста фиксированного размера, такого как SHA256, в качестве вектора инициализации для AES/CTR, действующего как псевдослучайный генератор. Затем отнимите первое число бит x от этого.
Это кажется вполне выполнимой задачей. Единственная проблема с этим подходом заключается в том, что я понятия не имею, как вычислить соответствующее значение x в зависимости от размера фрагмента данных. Я думаю, что моим целевым качеством будет статистическая невероятность коллизии SHA256 между двумя фрагментами данных размером 1 ГБ. У кого какие мысли по этому расчету?
Существуют ли какие-либо существующие алгоритмы хеширования дайджестов, которые уже делают это? Или есть какие-то другие подходы, которые дадут тот же результат?
Обновление: похоже, существует «губка» SHA3 Keccak, которая может выводить произвольное количество бит. Но мне все еще нужно знать, сколько бит мне нужно в зависимости от размера входных данных для постоянного качества. Звучало так, как будто этот алгоритм создает бесконечный поток битов, и вы просто усекаете столько, сколько хотите. Однако при тестировании в Ruby я ожидал, что первая половина SHA3-512 будет точно равна SHA3-256, но это не так...