Там какой-либо путь состоит в том, чтобы создать хеш строки во время компиляции с помощью препроцессора C/C++ (или даже шаблонное метапрограммирование)?
например. UNIQUE_SALT("HelloWord", 3DES);
Идея состоит в том, что HelloWorld не будет присутствовать в скомпилированном двоичном файле, просто хеш.
Править: Существуют многие из этих объявлений, распространенных по большой кодовой базе.
С 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;
... или просто сделать это как шаг перед сборкой.
Это можно сделать с помощью Boost.MPL, но это может быть не тот тип хэша, который вам нужен.
http://arcticinteractive.com/2009/04/18/compile-time-string-hashing-boost-mpl/
Даже если это невозможно (разумно) сделать с препроцессором, если вы использовали строковый литерал или объявил его как static const
и не создавал никаких постоянных ссылок на него, компилятор, скорее всего, продолжит и выполнит все математические вычисления для генерации результата и пропустит строку в объектном файле, если вы компилируете с оптимизацией. Самая сложная часть этого заключается в том, что вы не можете сделать код для инициализации глобальной или статической переменной слишком сложным, иначе компилятор скажет: «Эй, вы! Разве вы не знаете, что нельзя использовать цикл for вне функции? ? ".
Почему бы не создать хеш-часть процесса сборки? Вы можете написать простой командный файл для генерации хэша (при условии, что у вас есть программа для этого - если нет, напишите ее) и вывести директиву препроцессора, например:
#define MY_HASH 123456789
, в файл .h, который затем получит # включен в ваше приложение.