Russian Qt Forum
Ноябрь 25, 2024, 18:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Посоветуйте хэш-функцию для свертки не длинных массивов байт  (Прочитано 17622 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Апрель 23, 2014, 13:41 »

Исходные данные - массивы байт с переменной длиной от 8 Байт и до 256 КБайт. Наиболее частые имеют длину от 16 байт и до 1 КБайт. Более 1 КБайт массивы очень маловероятны. Нужна хэш-функция, которая давала бы свертку длиной 32 разряда, и с максимальной вероятностью несовпадения сверток. Может быть, достаточно будет CRC32? Или даже CRC16? Или может существуют другие хэш-функции для подобных задач?

То есть, задача не проверки "испорченности" данных, а проверки "совпадения", но именно для небольших массивов переменной длины, причем чаще всего довольно коротких.

Кто что посоветует? А то я в хэш-функциях не очень, на CRC и простых сигнатурных свертках мои познания в них заканчиваются.
Записан

2^7-1 == 127, задумайтесь...
OKTA
Гость
« Ответ #1 : Апрель 23, 2014, 14:17 »

Используй SHA и не мучайся выбором) Правда там длина хэша 160 бит в случае с SHA1, но это мелочи.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Апрель 23, 2014, 15:20 »

Да ну не... Это слишком избыточно. Таких данных, на которые этот хэш рассчитан, в моем случае никогда не появится. Не мелочи - объем вычислений имеет значение, я забыл написать. Считать хэш надо максимально возможно быстро, поэтому избыточность с повышением процессорной нагрузки не пригодна.
« Последнее редактирование: Апрель 23, 2014, 15:23 от Гурман » Записан

2^7-1 == 127, задумайтесь...
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #3 : Апрель 23, 2014, 15:27 »

Если требования именно 32 разрядный хэш, то какие ещё разумные варианты могут быть кроме CRC32?
Записан
OKTA
Гость
« Ответ #4 : Апрель 23, 2014, 15:35 »

CRC32 это ведь не хэш-функция по факту. Она разве гарантирует уникальность данных или другими словами разве она устойчива к коллизиям?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апрель 23, 2014, 16:29 »

CRC32 это ведь не хэш-функция по факту. Она разве гарантирует уникальность данных или другими словами разве она устойчива к коллизиям?
Уникальность хеш-ключа не требуется, просто "чем уникальнее - тем лучше" (меньше коллизий). С этой точки зрения CRC32 хороший кандидат
Записан
OKTA
Гость
« Ответ #6 : Апрель 23, 2014, 16:49 »

Без уникальности хэша нет смысла в самом хэше  Смеющийся
CRC32 уже выдает одинаковые значения на codding - gnu и exhibiters - schlager. И соответственно на всех производных от этих слов, если к ним справа что-то дописывать  Смеющийся
Если жестких требований к уникальности не ставится, то конечно можно использовать CRC, а в ином случае лучше использовать именно хэш-функции..

P.S. MD5 работает быстрее, чем SHA1. А если надо что-то еще быстрее, то алгоритмов миллион, просто не все стандартизованы.
« Последнее редактирование: Апрель 23, 2014, 16:53 от OKTA » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Апрель 23, 2014, 17:57 »

Без уникальности хэша нет смысла в самом хэше  Смеющийся
Пример: пусть данные int и в данный момент хеш имеет напр 5 bin'ов (корзин). Тогда хеш-ключ вычисляется как остаток от деления на 5. Да, хранящиеся в хеше значения напр 5, 10, 15 окажутся в одной корзине и будут все перебираться (обычно по списку). Это и есть "коллизии". Требование "уникальности" было бы бессмысленным, т.к. время обращения к такому хешу неприемлемо долго.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Апрель 23, 2014, 18:21 »

Требование "уникальности" было бы бессмысленным, т.к. время обращения к такому хешу неприемлемо долго.
Это почему?
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #9 : Апрель 23, 2014, 18:31 »

Без уникальности хэша нет смысла в самом хэше  Смеющийся
CRC32 уже выдает одинаковые значения на codding - gnu и exhibiters - schlager. И соответственно на всех производных от этих слов, если к ним справа что-то дописывать  Смеющийся
Если жестких требований к уникальности не ставится, то конечно можно использовать CRC, а в ином случае лучше использовать именно хэш-функции..

P.S. MD5 работает быстрее, чем SHA1. А если надо что-то еще быстрее, то алгоритмов миллион, просто не все стандартизованы.

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

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #10 : Апрель 23, 2014, 18:36 »

Если требования именно 32 разрядный хэш, то какие ещё разумные варианты могут быть кроме CRC32?

Скажем так - требование: работающий не медленнее, чем CRC32, и желательно не сильно более длинный. Может быть, 64 разряда, если выполнится требование уникальности и работать будет быстро.
Записан

2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #11 : Апрель 23, 2014, 18:43 »

http://ru.wikipedia.org/wiki/%D0%A5%D0%B5%D1%88_%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F_%D0%94%D0%B6%D0%B5%D0%BD%D0%BA%D0%B8%D0%BD%D1%81%D0%B0
http://ru.wikipedia.org/wiki/PJW-32
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #12 : Апрель 23, 2014, 19:00 »

Хэш-функция Дженкинса - это любопытно, тем более, что как там сказано, пригодна "обнаружения идентичных записей в базе данных" - тут задача сходная, надо обнаруживать именно совпадения. Увы, не сказано про длину этих записей. Поищем... Может еще кто знает какие варианты?
Записан

2^7-1 == 127, задумайтесь...
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #13 : Апрель 23, 2014, 19:18 »

CRC32 уже выдает одинаковые значения на codding - gnu и exhibiters - schlager. И соответственно на всех производных от этих слов, если к ним справа что-то дописывать  Смеющийся
Не понял - CRC32("codding - gnu") = 0xAD7CEA44, CRC32("exhibiters - schlager") = 0x389AE08C, CRC32("codding - gnu1") = 0xF2C016D4, CRC32("exhibiters - schlager1") = 0x67EABA5C (http://www.codenet.ru/services/crc32/)

64 разряда, если выполнится требование уникальности и работать будет быстро.
И снова не понял, о какой уникальности хэша может идти речь при ограниченной длине ключа. В любом случае для 64 битного ключа количество вариантов его значений = 2^64. То есть для 2^64+1 различных вариантов входных последовательностей будут гарантированно совпадать значения хэшей даже для идеальной в смысле минимизации коллизий функции.
Для гарантированно уникальной хэш функции на неограниченно длинной последовательности нужен неограниченно длинный ключ.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #14 : Апрель 23, 2014, 19:45 »

И снова не понял, о какой уникальности хэша может идти речь при ограниченной длине ключа. В любом случае для 64 битного ключа количество вариантов его значений = 2^64. То есть для 2^64+1 различных вариантов входных последовательностей будут гарантированно совпадать значения хэшей даже для идеальной в смысле минимизации коллизий функции.
Для гарантированно уникальной хэш функции на неограниченно длинной последовательности нужен неограниченно длинный ключ.

В условиях - входная последовательность ограничена. Более того - она короткая. Вот и интересно - существуют ли такие алгоритмы с ключом небольшой конечной длины, у которых вероятность коллизий на коротких данных 0-я, но увеличивается при увеличении длины входной последовательности? То есть, если вход до 256 КБ, то на таких данных коллизии не будет, но если бы этот же алгоритм применить для 1 МБ, то там уже возникают коллизии.

Такие алгоритмы есть? Интуитивно я догадываюсь, что должны быть, но не встречал никогда.
« Последнее редактирование: Апрель 23, 2014, 20:06 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.084 секунд. Запросов: 22.