| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > string hashing in compile-time |
| Автор: boostcoder 12.2.2011, 05:12 | ||||
| есть необходимость, в качестве ID`а для получения некоторого объекта, использовать строку. сейчас этот способ работает в run-time, и работает не плохо. но это делает невозможным статическую проверку соответствия типов, по понятным причинам. гуглением, нашел алгоритм создания хеш-суммы строки в compile-time: http://arcticinteractive.com/2009/04/18/compile-time-string-hashing-boost-mpl/ это кажется идеальное решение моей задачи, за исключением того, что строка необходимая алгоритму, должна разбиваться на части по 4 символа, или посимвольно, так же, по понятным причинам. т.е., вместо привычной теперешней записи ID`ов, придется писать так:
что абсолютно не юзабельно вопрос в том, как строку типа "object.method", корректно передать в этот алгоритм? всем спасибо. зы
http://liveworkspace.org/code/b3380d0e18ebffbe522710478202c062 |
| Автор: boostcoder 12.2.2011, 09:56 |
| наверное, правильнее не подстраиваться под имеющуюся реализацию, а написать подходящую, не использующую boost::mpl::string. |
| Автор: GoldFinch 12.2.2011, 14:43 |
как правильно написано в конце этой статьи, надо ждать constexpr которое уже есть в гцц 4.6 . также есть вот такой вариант http://2x2is11.blogspot.com/2010/11/c-how-to-calculate-string-hash-at.html хотя полученные им хеши не константы времени компиляции, фактически они получаются во время компиляции, может это можно как-то использовать. |
| Автор: mes 13.2.2011, 12:59 | ||
почему последние, а не первые ? Добавлено через 1 минуту и 37 секунд подсказка : '....' - это обычное число, и на него распространяются те же правила переполнения.. |
| Автор: boostcoder 13.2.2011, 13:01 | ||
упс, запутался Добавлено через 2 минуты и 38 секунд да. все верно. у этих строк значения одинаковые:
|
| Автор: mes 13.2.2011, 13:42 |
можно избавиться от ' ', но к сожалению запятая останется... т.е. строка будет задаваться как STR(a,b,c,d,e,f,g) при этом будет возможность задать свой алфавит символов... т.е. например запятую можно будет обозвать как comma.. для этого 1. для каждого символа создается свой тип 2. чтоб не было коллизий, имени типа символа задать общий уникальный префикс 3. определить макрос, который из переданной последовательности символов, создаст последовательность типов.. Добавлено через 9 минут и 58 секунд вот пример: http://forum.vingrad.ru/forum/topic-268064/anchor-entry1931740/13.html избавиться от _3 в LIST_OF_CHARS_3 тоже можно посредством эллипсиса.. |
| Автор: boostcoder 13.2.2011, 13:53 | ||
я тут всерьез подумываю о pre-build-step`е на котором, некоторая утилитка, из вызовов типа ".registry(&t, "type")" и ".on("method", &type::method)", создаст записи типа ".registry(&t, 0xf363e2)" и ".on(0x552a6b3, &type::method)" соответственно. или, привязать пользователей к gcc-4.6 ну не вижу я другого решения... |
| Автор: mes 13.2.2011, 13:55 | ||
это естественно менятся на что то типа : struct char_a { enum { value = 'a'}; }; |
| Автор: boostcoder 13.2.2011, 14:01 | ||
| но ни один из вариантов хорошим не назовешь, ибо оба через одно место... по переписке разработчиков выяснил, что ориентировочная дата выхода релиза - осень этого года в репозитариях его нет. т.е. остается либо собирать самому, либо искать чьи-то сборки. Добавлено через 28 секунд
да. я понял. |
| Автор: mes 13.2.2011, 14:08 | ||||
для этого для начала нужно представлять концепцию.. а вариантов куча, вот например еще один :
|
| Автор: boostcoder 13.2.2011, 14:17 | ||||
этого очень не хочется...
этого сейчас тоже нет. выглядит так:
для каждого обработчика требуется объект регистратор, время жизни которого, определяет время действительности регистрации. но сейчас нет статической проверки типов. потому и вожусь... хотя работает. может забить на проверку типов... реализовать когда gcc-4.6 выйдет.. |
| Автор: mes 13.2.2011, 16:37 | ||
для того чтоб была статическая проверка, надо будет все равно определить тип... тем более что, тип используется минимум в двух (при отправке и приеме).. вот что к примеру мешает сейчас добавить макрос, для такого использования :
? |
| Автор: boostcoder 13.2.2011, 16:43 | ||
ничего не мешает. просто я стремился избавиться от макросов и другой кодогенерации. и сейчас нет ни одного макроса. хотелось бы чтоб так и осталось |
| Автор: mes 13.2.2011, 16:44 | ||
вопрос был в принципе не о макросе.. а о третьей точке - о точке определения нового типа.. Как по Вашему, она должна быть или Вы ее специально избегаете ? Добавлено через 14 минут и 8 секунд макросы, в принципе, можно реализовать так, чтоб их присутствие не было в хидерах пользователя.. |
| Автор: mes 13.2.2011, 17:02 |
| например отделить рантайм представление ид от типа ... http://liveworkspace.org/code/ac0bac3f7199e62fea8cefe173170975 |
| Автор: boostcoder 13.2.2011, 17:03 |
| отвечу в нашей мегатеме. а то к этой теме это отношения уже не имеет... |
| Автор: boostcoder 13.2.2011, 22:53 |
вы не могли бы показать пример этого? я что-то не въезжаю |
| Автор: GoldFinch 14.2.2011, 00:48 |
| boostcoder, просто помечаете функцию как constexpr и она работает в compile-time http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2235.pdf (на самом деле есть ограничения, впрочем всеравно надо ждать гцц4.6 чтобы проверить) |
| Автор: boostcoder 14.2.2011, 00:53 | ||||
про constexpr я понял. я не помял что мне это даст.
как constexpr мне поможет использовать алгоритм mpl-hash в данном случае? Добавлено через 1 минуту и 55 секунд я могу проверить и сейчас. знать бы что проверять. |
| Автор: GoldFinch 14.2.2011, 00:56 | ||
| сомнительное это дело, писать код вслепую %) Добавлено через 5 минут и 4 секунды вобщем циклов там нет, рекурсии нет. зато там наверное можно сделать
если да - то это можно использовать в том http://2x2is11.blogspot.com/2010/11/c-how-to-calculate-string-hash-at.html Добавлено через 6 минут и 5 секунд работу со строковыми литералами надо проверять, что еще %) |
| Автор: mes 14.2.2011, 01:06 |
а рекурсии почему нет то ? |
| Автор: GoldFinch 14.2.2011, 01:10 | ||
mes, потому что Струструп так сказал
|
| Автор: mes 14.2.2011, 01:11 | ||
ну вот это для начала :
|
| Автор: boostcoder 14.2.2011, 01:13 |
вы о том, что у вас нет gcc-4.6 ? пожалуйста: rghost.ru/4342609 вчерашняя сборка из SVN. |
| Автор: GoldFinch 14.2.2011, 01:17 | ||||
boostcoder, при проверках надо учитывать что constexpr код может быть и динамически выполняемым:
массивы могут не подойти, т.к. может сработать расширение С99 лучше шаблоны или switch
|
| Автор: boostcoder 14.2.2011, 01:18 |
| mes, сейчас проверю. |
| Автор: GoldFinch 14.2.2011, 01:19 |
у меня никакого гцц нет) ок, попробуем.. |
| Автор: boostcoder 14.2.2011, 01:23 | ||||
забыл уточнить: это mingw. Добавлено через 4 минуты и 45 секунд mes, ваш код скомпилился только после такой поправки:
результат - 28. правильно. иначе такая ошибка:
|
| Автор: GoldFinch 14.2.2011, 01:28 | ||
работает |
| Автор: boostcoder 14.2.2011, 01:32 |
значит я правильно понял что mes имел ввиду. |
| Автор: mes 14.2.2011, 01:32 |
спс а ну да.. но для первого раза пойдет.. ну как терь сделать hash функцию нашли ? |
| Автор: GoldFinch 14.2.2011, 01:32 |
| ну вот, осталось хеш сделать.... |
| Автор: boostcoder 14.2.2011, 01:34 |
есть идеи. буду пробовать угу. и привязать пользователей к будущему стандарту |
| Автор: GoldFinch 14.2.2011, 01:34 |
| время позднее, ничего умнее макроса который будет раскрываться в копипасту мне на ум не приходит. Добавлено через 2 минуты и 53 секунды хотя есть вариант передавать строку как значение... |
| Автор: mes 14.2.2011, 01:42 |
тут два вопроса возникают.. 1. до сих пор не вижу как защитит типизацию Вас компил-тайм хэш.. 2. что мешает, для остальных компилятор использовать более неудобное представление ? |
| Автор: GoldFinch 14.2.2011, 01:50 | ||
слава копипасте... Добавлено через 4 минуты и 5 секунд для меня он уже настоящий (правда в пределах MSVC2010 =\ ) |
| Автор: boostcoder 14.2.2011, 02:10 |
| GoldFinch, а есть идеи, как избавиться от макроса? |
| Автор: GoldFinch 14.2.2011, 02:14 |
| нормальных - пока нету |
| Автор: boostcoder 14.2.2011, 02:16 |
| хватит на сегодня. спать. всем спасибо и сн. |
| Автор: GoldFinch 14.2.2011, 02:25 |
| просто считайте что его там нет. (наверное это самое эффективное решение) |
| Автор: boostcoder 14.2.2011, 02:39 |
| GoldFinch, а в микрософтстудии constexpr реализован? |
| Автор: GoldFinch 14.2.2011, 02:43 |
| boostcoder, неа, там вообще мало что реализовано, лямбды, auto, decltype, r-value references |
| Автор: mes 14.2.2011, 02:55 | ||
этот код работает ? тогда можно используя рекурсию шаблонов, создать хэш-итератор.. |
| Автор: boostcoder 14.2.2011, 03:00 | ||
да можно подробнее? ;) Добавлено через 1 минуту и 18 секунд расширил возможность использовать до 64ех символов. вроде длинее быть не должно
Добавлено через 12 минут забыл сказать, результат - 720 Добавлено через 12 минут и 59 секунд в смысле, чтоб избавиться от баяна чаров? вариант. |
| Автор: mes 14.2.2011, 16:33 | ||
вот примерно:
допиливайте |
| Автор: mes 14.2.2011, 21:36 |
нельзя ли прокомментировать, откуда взялось 130 ?! Добавлено через 1 минуту и 13 секунд а кто такой "баян" в данном контексте ? |
| Автор: boostcoder 14.2.2011, 21:47 | ||
не уверен, но полагаю, что это из-за нулевого символа добавляемого в конец хешируемой строки, и того = 129. или что? вот. ну чем не баян? ;)
|
| Автор: mes 14.2.2011, 21:59 |
все дошло.. я "баян" забыл посчитать.. Добавлено через 1 минуту и 7 секунд а пример тремя постами выше с шаблонной рекурсией подошел ? или еще не пробовали ? |
| Автор: boostcoder 14.2.2011, 22:03 | ||
завтра буду пробовать. сегодня повод, как ни как Добавлено через 11 минут и 55 секунд вот. проверил. ничего не пришлось допиливать
|
| Автор: GoldFinch 14.2.2011, 22:17 |
| кстати да, FNV1-a не лучший хеш для этой задачи, надо бы поискать что получше |
| Автор: boostcoder 14.2.2011, 22:19 |
гугл меня вчера завел на какой-то сайт, и там была куча его разновидностей, и букв. потому не осилил Добавлено через 5 минут и 58 секунд тему переименовал. не теряйтесь |
| Автор: Abyx 16.2.2011, 01:29 |
| нда.. похоже что кроме как генерацией кучи шаблонов, циклов для constexpr не получить. насчет хеширования строк: http://bretm.home.comcast.net/~bretm/hash/7.html - если верить этой статье, Bob Jenkins' hash достаточно хорош для строк (а crc32 очень плох) надо будет попробовать реализовать его для constexpr. код: http://burtleburtle.net/bob/c/lookup3.c |
| Автор: Abyx 16.2.2011, 13:11 |
| также надо бы подумать о надежном применении хешей для switch как минимум надо чтобы небыло коллизий между хешами меток в одном switch'e можно также потребовать чтобы коллизий не было во всей единице трансляции, это слишком строгое требование, но возможно его проще реализовать |
| Автор: mes 16.2.2011, 20:10 | ||
ну switch, насколько я знаю, просто напросто не нужен.. а для проверки коллизий, можно использовать карту соответствий, которая так и так составляется.. исхожу из ранее приведенных boostcoder`ом данных. |
| Автор: boostcoder 16.2.2011, 20:15 | ||||
не понимаю в чем проблема... если коллизия произойдет, компилятор вам об этом скажет:
|
| Автор: Abyx 16.2.2011, 20:28 |
| хм.. действительно |