Russian Qt Forum
Ноябрь 23, 2024, 00:17
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Программирование
>
Алгоритмы
>
Посоветуйте хэш-функцию для свертки не длинных массивов байт
Страниц: [
1
]
2
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Посоветуйте хэш-функцию для свертки не длинных массивов байт (Прочитано 17608 раз)
Гурман
Гуру общения
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
Гость
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #1 :
Апрель 23, 2014, 14:17 »
Используй SHA и не мучайся выбором) Правда там длина хэша 160 бит в случае с SHA1, но это мелочи.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #2 :
Апрель 23, 2014, 15:20 »
Да ну не... Это слишком избыточно. Таких данных, на которые этот хэш рассчитан, в моем случае никогда не появится. Не мелочи - объем вычислений имеет значение, я забыл написать. Считать хэш надо максимально возможно быстро, поэтому избыточность с повышением процессорной нагрузки не пригодна.
«
Последнее редактирование: Апрель 23, 2014, 15:23 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
xokc
Птица говорун
Offline
Сообщений: 976
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #3 :
Апрель 23, 2014, 15:27 »
Если требования именно 32 разрядный хэш, то какие ещё разумные варианты могут быть кроме CRC32?
Записан
OKTA
Гость
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #4 :
Апрель 23, 2014, 15:35 »
CRC32 это ведь не хэш-функция по факту. Она разве гарантирует уникальность данных или другими словами разве она устойчива к коллизиям?
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #5 :
Апрель 23, 2014, 16:29 »
Цитата: OKTA от Апрель 23, 2014, 15:35
CRC32 это ведь не хэш-функция по факту. Она разве гарантирует уникальность данных или другими словами разве она устойчива к коллизиям?
Уникальность хеш-ключа не требуется, просто "чем уникальнее - тем лучше" (меньше коллизий). С этой точки зрения CRC32 хороший кандидат
Записан
OKTA
Гость
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #6 :
Апрель 23, 2014, 16:49 »
Без уникальности хэша нет смысла в самом хэше
CRC32 уже выдает одинаковые значения на codding - gnu и exhibiters - schlager. И соответственно на всех производных от этих слов, если к ним справа что-то дописывать
Если жестких требований к уникальности не ставится, то конечно можно использовать CRC, а в ином случае лучше использовать именно хэш-функции..
P.S. MD5 работает быстрее, чем SHA1. А если надо что-то еще быстрее, то алгоритмов миллион, просто не все стандартизованы.
«
Последнее редактирование: Апрель 23, 2014, 16:53 от OKTA
»
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #7 :
Апрель 23, 2014, 17:57 »
Цитата: OKTA от Апрель 23, 2014, 16:49
Без уникальности хэша нет смысла в самом хэше
Пример: пусть данные int и в данный момент хеш имеет напр 5 bin'ов (корзин). Тогда хеш-ключ вычисляется как остаток от деления на 5. Да, хранящиеся в хеше значения напр 5, 10, 15 окажутся в одной корзине и будут все перебираться (обычно по списку). Это и есть "коллизии". Требование "уникальности" было бы бессмысленным, т.к. время обращения к такому хешу неприемлемо долго.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #8 :
Апрель 23, 2014, 18:21 »
Цитата: Igors от Апрель 23, 2014, 17:57
Требование "уникальности" было бы бессмысленным, т.к. время обращения к такому хешу неприемлемо долго.
Это почему?
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #9 :
Апрель 23, 2014, 18:31 »
Цитата: OKTA от Апрель 23, 2014, 16:49
Без уникальности хэша нет смысла в самом хэше
CRC32 уже выдает одинаковые значения на codding - gnu и exhibiters - schlager. И соответственно на всех производных от этих слов, если к ним справа что-то дописывать
Если жестких требований к уникальности не ставится, то конечно можно использовать CRC, а в ином случае лучше использовать именно хэш-функции..
P.S. MD5 работает быстрее, чем SHA1. А если надо что-то еще быстрее, то алгоритмов миллион, просто не все стандартизованы.
Требование уникальности есть для указанного выше диапазона входных данных. Поэтому CRC32 не подходит. MD5 пожалуй тоже избыточен. Какие еще есть алгоритмы, удовлетворяющие требованию уникальности для относительно небольших данных? Пусть даже не стандартизованные - это нужно только внутри приложения.
Записан
2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #10 :
Апрель 23, 2014, 18:36 »
Цитата: xokc от Апрель 23, 2014, 15:27
Если требования именно 32 разрядный хэш, то какие ещё разумные варианты могут быть кроме CRC32?
Скажем так - требование: работающий не медленнее, чем CRC32, и желательно не сильно более длинный. Может быть, 64 разряда, если выполнится требование уникальности и работать будет быстро.
Записан
2^7-1 == 127, задумайтесь...
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #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
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #12 :
Апрель 23, 2014, 19:00 »
Хэш-функция Дженкинса - это любопытно, тем более, что как там сказано, пригодна "обнаружения идентичных записей в базе данных" - тут задача сходная, надо обнаруживать именно совпадения. Увы, не сказано про длину этих записей. Поищем... Может еще кто знает какие варианты?
Записан
2^7-1 == 127, задумайтесь...
xokc
Птица говорун
Offline
Сообщений: 976
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #13 :
Апрель 23, 2014, 19:18 »
Цитата: OKTA от Апрель 23, 2014, 16:49
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/
)
Цитата: Гурман от Апрель 23, 2014, 18:36
64 разряда, если выполнится требование уникальности и работать будет быстро.
И снова не понял, о какой уникальности хэша может идти речь при ограниченной длине ключа. В любом случае для 64 битного ключа количество вариантов его значений = 2^64. То есть для 2^64+1 различных вариантов входных последовательностей будут
гарантированно
совпадать значения хэшей даже для идеальной в смысле минимизации коллизий функции.
Для гарантированно уникальной хэш функции на неограниченно длинной последовательности нужен неограниченно длинный ключ.
Записан
Гурман
Гуру общения
Offline
Сообщений: 1442
Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12
Re: Посоветуйте хэш-функцию для свертки не длинных массивов байт
«
Ответ #14 :
Апрель 23, 2014, 19:45 »
Цитата: xokc от Апрель 23, 2014, 19:18
И снова не понял, о какой уникальности хэша может идти речь при ограниченной длине ключа. В любом случае для 64 битного ключа количество вариантов его значений = 2^64. То есть для 2^64+1 различных вариантов входных последовательностей будут
гарантированно
совпадать значения хэшей даже для идеальной в смысле минимизации коллизий функции.
Для гарантированно уникальной хэш функции на неограниченно длинной последовательности нужен неограниченно длинный ключ.
В условиях - входная последовательность
ограничена
. Более того - она короткая. Вот и интересно - существуют ли такие алгоритмы с ключом небольшой конечной длины, у которых вероятность коллизий на коротких данных 0-я, но увеличивается при увеличении длины входной последовательности? То есть, если вход до 256 КБ, то на таких данных коллизии не будет, но если бы этот же алгоритм применить для 1 МБ, то там уже возникают коллизии.
Такие алгоритмы есть? Интуитивно я догадываюсь, что должны быть, но не встречал никогда.
«
Последнее редактирование: Апрель 23, 2014, 20:06 от Гурман
»
Записан
2^7-1 == 127, задумайтесь...
Страниц: [
1
]
2
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...