Поиск:

Ответ в темуСоздание новой темы Создание опроса
> хранение и поиск по ключу SHA1, какую структуру использовать 
V
    Опции темы
null56
Дата 29.2.2012, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



Задача  следующая: 
http://tools.ietf.org/html/draft-ietf-mane...3#section-6.2.2
Необходимо организовать таблицу, ключом к которой является 20 байтное значение SHA-1

Подскажите пожалуйста каким образом наиболее эффективно можно организовать данную таблицу?
У меня были варианты c radix, rb tree, но у них есть свои недостатки из - за довольно большого и главное произвольного значения самого SHA-1.

Я не против rb tree, но проверка 20 байтов при довольно частом обращении и большом количестве записей, мне кажется накладно. Частота поступления запросов очень большая...

Может быть кто - нибудь огранизовывал хеш таблицу по такому ключу?

Заранее благодарен за помощь
PM MAIL   Вверх
volatile
Дата 1.3.2012, 00:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



хеш мап. на С++.
Причем хешем для 20 байтов sha1 написать простейшую функцию, выбирающую просто первое слово (4 байта из 20)
В силу того что sha1 очень не плохо перемешан, это будет хороший и быстрый хеш.
Все возможные коллизии, (а их будет совсем не много), разрешит хеш.мап.
Быстрее, имхо, врядли что-то можно придумать в данном случае.
(только если изменить само условие)
Цитата(null56 @  29.2.2012,  17:25 Найти цитируемый пост)
ключом к которой является 20 байтное значение SHA-1

Само условие явно не эффективно, но это уже другой вопрос.
PM MAIL   Вверх
null56
Дата 1.3.2012, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



а можно по подробнее по организации... особенно по формированию хеш таблицы... ++ у меня не будет возможности использовать, всё будет в ядре
подробнее по выбору ключа и расширению таблицы, тут мне подсказать можете?
PM MAIL   Вверх
boostcoder
Дата 1.3.2012, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



null56, так а в чем проблема?
нет готовой реализации rb tree на Си? или нет возможности назначит свой предикат, который будет работать как предложил volatile ?

Цитата(null56 @  29.2.2012,  17:25 Найти цитируемый пост)
radix

это что?
PM WWW   Вверх
null56
Дата 1.3.2012, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12




Цитата(boostcoder @  1.3.2012,  14:16 Найти цитируемый пост)
это что? 

дерево корней или как там его еще называются
http://en.wikipedia.org/wiki/Radix_tree
Цитата(boostcoder @  1.3.2012,  14:16 Найти цитируемый пост)
нет готовой реализации rb tree на Си? или нет возможности назначит свой предикат, который будет работать как предложил volatile ?

мне интересно хеширование больше, потому что 20 байтов ключ + поиск по довольно большой таблице, ибо данное значение вычисляется и ищется и со временем удаляется в дереве для КАЖДОГО приходящего мультикаст пакета....

я правильно понял, что первые 4 байта 20 байтного хеша будут хорошо разбросаны?
PM MAIL   Вверх
boostcoder
Дата 1.3.2012, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



Цитата(null56 @  1.3.2012,  14:50 Найти цитируемый пост)
потому что 20 байтов ключ

т.е. смущает сам размер ключа? или то что сравнение такого ключа будет затратно?

Цитата(null56 @  1.3.2012,  14:50 Найти цитируемый пост)
первые 4 байта 20 байтного хеша будут хорошо разбросаны?

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

такой способ сравнения довольно незатратен.
PM WWW   Вверх
null56
Дата 1.3.2012, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



Цитата(volatile @  1.3.2012,  00:19 Найти цитируемый пост)
Само условие явно не эффективно, но это уже другой вопрос. 

ну это не я придумал, так в документе описано, не знаю чем они руководствовались при написании

Добавлено через 11 минут и 59 секунд
Цитата(boostcoder @  1.3.2012,  14:54 Найти цитируемый пост)
т.е. смущает сам размер ключа? или то что сравнение такого ключа будет затратно?

сравнение наверное более критично

Цитата(boostcoder @  1.3.2012,  14:54 Найти цитируемый пост)
тут нужно хорошо знать SHA1.
но допустим, не очень хорошо... в таком случае, если в предикате совпадают первые 4 байта, ты можешь сравнить следующие 4 байта. и так до тех пор, пока не найдешь неравенство, или пока не достигнешь полного ключа. это будет означать что ключи равны.

вопрос что хранить в качестве ключа?
4 байта хорошо... использовать в качестве индекса хештаблицы, вообще отлично...
при колизиях, которые, если верить, что первые 4 байта будут хорошо перемешаны, сравнивать до конца, для окончательного поиска...

+ при колизиях SHA-1 у нас еще имеются дополнительные параметры сравнения saddr, daddr, но это уже другой вопрос для обсуждения

PM MAIL   Вверх
boostcoder
Дата 1.3.2012, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



Цитата(null56 @  1.3.2012,  14:57 Найти цитируемый пост)
вопрос что хранить в качестве ключа?

так саму SHA1 и хранить. или я чего-то не понял?...
PM WWW   Вверх
null56
Дата 1.3.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



кстати, нашел реализацию smf на с++ надо глянуть, как они там поступают
http://cs.itd.nrl.navy.mil/work/smf/index.php

Добавлено через 5 минут и 45 секунд
Цитата(boostcoder @  1.3.2012,  15:12 Найти цитируемый пост)
так саму SHA1 и хранить. или я чего-то не понял?... 

ну вообще разницы тогда я не очень понимаю, по 4 байта мы сравниваем или memcmp 20 байтов


я так понял, volatile предолжил использовать первые 4 байта, как хеш ключ, чтобы находить узел (или колизию) за время 0(1), тогда сравнение потребуется только для редких колизий

radix не подходит из - за сильного разброса всех 20 байтов
PM MAIL   Вверх
boostcoder
Дата 1.3.2012, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



Цитата(null56 @  1.3.2012,  15:18 Найти цитируемый пост)
вообще разницы тогда я не очень понимаю, по 4 байта мы сравниваем или memcmp 20 байтов

так разница в затратах.
зачем сравнивать 20 байт, когда, к примеру, первые два уже не равны? ;)

Цитата(null56 @  1.3.2012,  15:18 Найти цитируемый пост)
volatile предолжил использовать первые 4 байта, как хеш ключ

ох и стрёмно это)

PM WWW   Вверх
null56
Дата 1.3.2012, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



Цитата(boostcoder @  1.3.2012,  15:32 Найти цитируемый пост)
зачем сравнивать 20 байт, когда, к примеру, первые два уже не равны? ;)

я имел в виду, что функция memcmp выйдет после несовпадения первого же байта(хотя может это зависит от реализации), а при вытаскивании по 4 байта и сравнение их, мне кажется инструкций потребуется больше
PM MAIL   Вверх
boostcoder
Дата 1.3.2012, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: нет
Всего: 110



Цитата(null56 @  1.3.2012,  15:36 Найти цитируемый пост)
функция memcmp выйдет после несовпадения первого же байта

точно! вот я затупил... smile 
PM WWW   Вверх
volatile
Дата 1.3.2012, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 2
Всего: 85



Цитата(null56 @  1.3.2012,  15:18 Найти цитируемый пост)
я так понял, volatile предолжил использовать первые 4 байта, как хеш ключ, чтобы находить узел (или колизию) за время 0(1), тогда сравнение потребуется только для редких колизий

Да, именно так.

Цитата(null56 @  1.3.2012,  14:50 Найти цитируемый пост)
я правильно понял, что первые 4 байта 20 байтного хеша будут хорошо разбросаны? 

Не только первые, а вообще любые байты у профессиональных хешей md5,md4, sha1, и т.д. разбросаны очень хорошо.
sha1 вообще разрабатывался как криптоустойчивый хеш, поэтому разброс там очень и очень хорош!

PM MAIL   Вверх
Nica
Дата 2.3.2012, 00:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 2.3.2012

Репутация: нет
Всего: нет



1) две таблицы использовать? и этот ключ связывать по id?
2) этот ключ преобразовать с помощью mime64 ли аналога какого-то? (так же есть возможность в mime64 с фиксированной длинной)

Это сообщение отредактировал(а) Nica - 2.3.2012, 00:32
PM MAIL   Вверх
null56
Дата 2.3.2012, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: нет
Всего: 12



Nica, это кому вопрос, мне?

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

volatile, вам не приходилось создавать руками хеш таблицы? не чем поделиться в этом плане?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.0918 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.