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

Там какой-либо путь состоит в том, чтобы создать хеш строки во время компиляции с помощью препроцессора C/C++ (или даже шаблонное метапрограммирование)?

например. UNIQUE_SALT("HelloWord", 3DES);

Идея состоит в том, что HelloWorld не будет присутствовать в скомпилированном двоичном файле, просто хеш.

Править: Существуют многие из этих объявлений, распространенных по большой кодовой базе.

15
задан Brian Tompsett - 汤莱恩 24 February 2016 в 14:27
поделиться

4 ответа

С C ++ 0x это возможно, как описано в ответах в # 1 и # 2 .

В C ++ 03 не было обработки строки времени компиляции. С препроцессором вы не можете разделить строку на токены, с шаблонами вы не можете получить доступ к отдельным символам. Однако было обсуждение предполагаемого подхода с использованием C ++ 0x .

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

foo = hash<3DES, str<'a','b','c'> >::result;
// or:
foo = hash<3DES, str<'abc','def'> >::result;

... или просто сделать это как шаг перед сборкой.

12
ответ дан 1 December 2019 в 00:33
поделиться

Это можно сделать с помощью Boost.MPL, но это может быть не тот тип хэша, который вам нужен.

http://arcticinteractive.com/2009/04/18/compile-time-string-hashing-boost-mpl/

6
ответ дан 1 December 2019 в 00:33
поделиться

Даже если это невозможно (разумно) сделать с препроцессором, если вы использовали строковый литерал или объявил его как static const и не создавал никаких постоянных ссылок на него, компилятор, скорее всего, продолжит и выполнит все математические вычисления для генерации результата и пропустит строку в объектном файле, если вы компилируете с оптимизацией. Самая сложная часть этого заключается в том, что вы не можете сделать код для инициализации глобальной или статической переменной слишком сложным, иначе компилятор скажет: «Эй, вы! Разве вы не знаете, что нельзя использовать цикл for вне функции? ? ".

3
ответ дан 1 December 2019 в 00:33
поделиться

Почему бы не создать хеш-часть процесса сборки? Вы можете написать простой командный файл для генерации хэша (при условии, что у вас есть программа для этого - если нет, напишите ее) и вывести директиву препроцессора, например:

#define MY_HASH 123456789 

, в файл .h, который затем получит # включен в ваше приложение.

12
ответ дан 1 December 2019 в 00:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: