Быстрая хеш-функция с возможностью коллизии около SHA-1

Я использую SHA-1 для обнаружения дубликатов в программе, обрабатывающей файлы. Это не обязательно должно быть криптостойким и может быть обратимым. Я нашел этот список быстрых хэш-функций https://code.google.com/p/xxhash/

Что выбрать, если мне нужна более быстрая функция и конфликт случайных данных рядом с SHA-1?

Может быть, 128-битного хеша достаточно для дедупликации файлов? (против 160 бит sha-1)

В моей программе хеш рассчитывается для блоков от 0 до 512 КБ.


person Stig    schedule 22.02.2015    source источник
comment
Используйте тот, который использует git. Если он достаточно хорош для git, он достаточно хорош и для вас!   -  person joop    schedule 07.04.2015
comment
Git использует SHA-1, и «горячий цикл» рабочего процесса Git явно не коммит Git. OP и я заинтересованы в хэш-функциях, которые целесообразно использовать для горячего цикла (например, в базе данных in-mem), которые предлагают очень сильные гарантии коллизий, независимость от битов и т. Д.   -  person alphazero    schedule 08.04.2015
comment
CPU Fast, вероятно, не имеет значения - ввод-вывод, вероятно, будет почти все прошедшее время.   -  person Rick James    schedule 09.04.2015
comment
предоставлено. но подумайте о том, чтобы перефразировать in-mem k / v. Но ты прав.   -  person alphazero    schedule 09.04.2015
comment
@Stig Вы смотрели на Blake2B? blake2.net Версия C работает так же быстро, как MD5, и является криптографической. Я написал версию для Java, но не могу заставить ее работать быстрее, чем SHA-1. github.com/alphazero/blake2b   -  person alphazero    schedule 09.04.2015
comment
@alphazero Я не знал этого раньше, но у него есть криптографическое свойство, которое мне не нужно. На самом деле я сейчас тестирую Murmur3 128bit, и он выглядит довольно быстро. Также существует несколько Java-реализаций Murmur3.   -  person Stig    schedule 10.04.2015
comment
Изучая варианты, я обнаружил, что github.com/gpnuma/fsbench, тест, который можно запускать специально на ваши машины и файлы и сравните производительность различных алгоритмов хеширования.   -  person Daniel Darabos    schedule 11.04.2015
comment
Насколько быстрее вам нужно? Какая у вас целевая аппаратная платформа? SHA-1 привязан к вводу-выводу на любом современном ПК. Помните, что вы можете использовать любой симметричный шифр, который может дать вам полезные параметры, если вы находитесь в среде с ограниченным ЦП / ОЗУ.   -  person Ian Howson    schedule 14.04.2015
comment
SHA-1 привязан к вводу-выводу на любом современном ПК - есть ли у вас какой-либо источник на этом?   -  person Dmitry Grigoryev    schedule 15.04.2015


Ответы (7)


Может быть, это поможет вам: https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

редкие коллизии: FNV-1, FNV-1a, DJB2, DJB2a, SDBM и MurmurHash

Я не знаю насчет xxHash, но это тоже выглядит многообещающим.

MurmurHash работает очень быстро, а версия 3 поддерживает длину 128 бит, я бы выбрал эту. (Реализовано на Java и Scala.)

person A. Binzxxxxxx    schedule 08.04.2015
comment
Спасибо. Принятый ответ носит эмпирический характер, а набор выборок - 2 ^ 20, что очень мало :) - person alphazero; 08.04.2015
comment
не существует общей лучшей хеш-функции. это всегда зависит от того, чего вы хотите достичь и каковы ваши реальные данные в реальном времени. сделайте свои собственные тесты для вашего варианта использования;) - person A. Binzxxxxxx; 13.04.2015

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

Если мы предположим, что ваш алгоритм имеет абсолютное единообразие, вероятность коллизии хэшей среди n файлов, использующих хеши с возможными значениями d, будет:

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

Например, если вам нужна вероятность столкновения ниже одного из миллиона среди миллиона файлов, вам потребуется иметь более 5 * 10 ^ 17 различных значений хэша, что означает, что ваши хэши должны иметь не менее 59 бит. Давайте округлим до 64, чтобы учесть, возможно, плохую однородность.

Поэтому я бы сказал, что вам должно хватить любого приличного 64-битного хеша. Более длинные хэши еще больше снизят вероятность коллизии за счет более тяжелых вычислений и увеличения объема хеш-хранилища. Более короткие кеши, такие как CRC32, потребуют от вас написания некоторого явного кода обработки конфликтов.

person Dmitry Grigoryev    schedule 14.04.2015
comment
не понимал, что награда по умолчанию. Если бы до меня отдал бы это вам. - person alphazero; 18.04.2015
comment
Это очень лестно, спасибо! Имейте в виду, что автоматически назначаемые награды теряют половину своей ценности, поэтому всегда лучше назначать их вручную, даже если вы выберете ответ с наибольшим количеством голосов. - person Dmitry Grigoryev; 18.04.2015
comment
предположить, что этот алгоритм имеет абсолютное единообразие, все равно что сказать, что Земля - ​​идеальная сфера. В некоторых случаях это может быть хорошо, но бесполезно, если вы заботитесь о деталях. Это просто хорошо для оценки необходимой длины хэша. - person A. Binzxxxxxx; 01.08.2017
comment
кроме того, вы, скорее всего, все равно связаны вводом-выводом при большом количестве хеширования - person A. Binzxxxxxx; 01.08.2017
comment
@ A.Binzxxxxxx Ну, это именно то, что я здесь делаю: оцениваю нижнюю границу длины хэша с учетом целевой вероятности столкновения. - person Dmitry Grigoryev; 01.08.2017

Google разработал и использует (я думаю) FarmHash для хеширования, критичного к производительности. На странице проекта:

FarmHash является преемником CityHash и включает многие из тех же приемов и техник, некоторые из которых взяты из MurmurHash Остина Эпплби.

...

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

(CityHash уже был семейством хэш-функций с оптимизацией производительности от Google.)

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

person Daniel Darabos    schedule 09.04.2015
comment
на самом деле просто смотрел обсуждение HN, где они разорвали CityHash. news.ycombinator.com/item?id=4600425 :( - person alphazero; 09.04.2015
comment
Вы знаете, применимо ли это и к FarmHash? В любом случае мы говорим о некриптографических хэшах, поэтому все ставки сделаны против злонамеренного ввода. - person Daniel Darabos; 09.04.2015
comment
(возможно, дурак) Нет, не знаю. Я слышу вас, но это может быть только смысловое различие. Почему так легко обнаружить столкновение? Также давайте помнить: баги .. :) - person alphazero; 10.04.2015
comment
К вашему сведению, я собираюсь использовать SipHash. О FarmHash нет ни слова, но проверьте здесь опубликованные атаки на различные функции, включая Murmur3: 131002.net/siphash (статью стоит прочитать.) - person alphazero; 11.04.2015

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

64 бита также могут оказаться достаточно хорошими, если количество файлов или фрагментов, которые вы хотите отслеживать, остается «достаточно маленьким» (то есть не более нескольких миллионов).

После определения размера хэша вам понадобится хеш с некоторыми очень хорошими характеристиками распределения, такими как те, которые указаны с Q.Score = 10 в вашей ссылке.

person Cyan    schedule 11.04.2015

Факты:

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

Вывод:
В вашем случае я бы попробовал гораздо более быстрый алгоритм, такой как CRC32, который имеет почти все необходимые вам свойства и может обрабатывать более 99,9% случаев и только прибегая к более медленному методу сравнения (например, бинарному сравнению), чтобы исключить ложные срабатывания. Быть намного быстрее в подавляющем большинстве сравнений, вероятно, компенсирует отсутствие "потрясающей" однородности (возможно, сгенерировав еще несколько столкновений).

person ulix    schedule 11.04.2015
comment
Достаточно большую вероятность можно считать достоверной для практического использования. Если вы думаете о написании кода, который с вероятностью 1/1000000 будет выполнен за время жизни программы, вы можете также избегать выхода на улицу, потому что молнии в два раза выше! - person Dmitry Grigoryev; 15.04.2015
comment
Вероятность столкновения в этом случае, вероятно, не так низка, как вы могли подумать, если у вас есть несколько миллионов файлов для тестирования (см. Это: preshing.com/20110504/hash-collision-probabilities). Пример: вероятность равна 1/2 при использовании 32-битной хеш-функции всего с 77 КБ файлов! Хотя шансы резко снижаются с 160 или даже 64-битными функциями, я считаю, что, вероятно, быстрее использовать CRC32 для исключения 99,99% случаев, даже если предположить, что вам понадобится более медленная хеш-функция для работы с небольшим количеством случаев, чем делать все за один раз, вычисляя 160-битную хеш-функцию для каждого файла. - person ulix; 16.04.2015
comment
CRC-32 предназначен для очень маленьких данных с короткими пакетными ошибками или одиночными битовыми ошибками. Его ширина всего 32 бита, и он медленнее, чем некриптографические хэши, такие как MurmurHash3 (128-бит), SpookyHash (128-бит) и xxHash (64-бит) и т. Д. Есть гораздо лучшие, быстрые и надежные варианты. . - person bryc; 16.04.2018

Это как бы зависит от того, сколько хэшей вы собираетесь вычислить за итерацию. Например, 64-битный хэш достигает вероятности столкновения 1 из 1000000 при вычислении 6 миллионов хешей.

См .: Вероятности коллизии хэша

person evictednoise    schedule 14.04.2015
comment
вероятность 1 из 100000 при вычислении 6 миллионов хэшей. Я думаю, вы пропустили ноль, реальная вероятность будет примерно в 10 раз меньше. - person Dmitry Grigoryev; 14.04.2015
comment
Интересный случай, например, когда хеш-выход равен, например, 128b, ›64b, и биты независимы, и вы маскируете 64b для использования в качестве ключей. Учтите, что конфликт может быть в битах, которые были замаскированы (т.е. не в части полученного ключа). Интуитивно кажется, что в этом случае у нас были бы лучшие вероятности. (Не подсчитал.) - person alphazero; 14.04.2015
comment
Коллизия - это когда ВСЕ биты хэшей совпадают, поэтому, если вы замаскируете некоторые биты, это все еще будет коллизией. Однако вы можете ввести новые столкновения при маскировке. Не уверен, какое практическое применение может иметь такая маскировка - в конечном итоге вы тратите время процессора на вычисления битов, которые не будете использовать. - person Dmitry Grigoryev; 15.04.2015

Ознакомьтесь с MurmurHash2_160. Это модификация MurmurHash2, которая выдает 160-битный вывод.

Он вычисляет 5 уникальных результатов MurmurHash2 параллельно и тщательно их смешивает. Вероятность коллизии эквивалентна SHA-1 на основе размера дайджеста.

Это по-прежнему быстро, но MurmurHash3_128, SpookyHash128 и MetroHash128, вероятно, быстрее, хотя и с более высокой (но все же очень маловероятной) вероятностью столкновения. Также есть CityHash256, который выдает 256-битный вывод, который также должен быть быстрее, чем SHA-1.

person bryc    schedule 16.04.2018