Истинно хеширование строк во время компиляции в C ++ - PullRequest
9 голосов
/ 23 июня 2011

В основном мне нужно действительно хеширование строк во время компиляции в C ++. Меня не волнует специфика техники, могут быть шаблоны, макросы, что угодно. Все другие методы хэширования, которые я видел до сих пор, могут генерировать хеш-таблицу (например, 256 хешей CRC32) во время компиляции, а не настоящий хеш.

Другими словами, мне нужно это

printf("%d", SOMEHASH("string"));

для компиляции как (в псевдо-ассемблере)

push HASHVALUE
push "%d"
call printf

даже в сборках отладки, без операций во время выполнения над строкой. Я использую GCC 4.2 и Visual Studio 2008, и мне нужно, чтобы решение было в порядке для этих компиляторов (поэтому нет C ++ 0x).

Ответы [ 6 ]

7 голосов
/ 23 июня 2011

Проблема в том, что в C ++ 03 результат подписывания строкового литерала (т. Е. Доступа к одному символу) не является константой времени компиляции, подходящей для использования в качестве параметра шаблона.

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

printf("%d", SOMEHASH("string"));

конвертируется в

printf("%d", 257359823 /*SOMEHASH("string")*/ ));

6 голосов
/ 23 июня 2011

Напишите свой собственный препроцессор, который сканирует исходный код для SOMEHASH ("") и заменяет его вычисленным хешем. Затем передайте результат этого компилятору.

(Аналогичные методы используются для I18N.)

3 голосов
/ 23 июня 2011

С шаблонами будет работать только следующий синтаксис: SOMEHASH <'s', 't', 'r', 'i', 'n', 'g'>

см., Например: http://arcticinteractive.com/2009/04/18/compile-time-string-hashing-boost-mpl/ или хеширование строки во время компиляции

1 голос
/ 23 июня 2011

Для этого вам нужно дождаться пользовательских литералов в C ++ 0x.

0 голосов
/ 23 июня 2011

Если вы не возражаете против использования нового стандарта C ++ 0x в своем коде (некоторые ответы также включают ссылки на материалы, которые работают в более старом стандарте C ++ 03), эти вопросы уже задавались ранее в StackOverflow:

Хеширование строки во время компиляции (препроцессора)
Хэширование строки во время компиляции

Оба из них содержат ответы, которые помогут вам выяснить,как это возможно реализовать.

Вот сообщение в блоге, в котором показано, как использовать Boost.MPL Хеширование строки времени компиляции

0 голосов
/ 23 июня 2011

Это невозможно, это может быть в C ++ 0x, но определенно не в C ++ 03.

...