Любой встроенный метод хеширования в C ++? - PullRequest
9 голосов
/ 01 июня 2011

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

Пока я занимался исследованиями C ++, я видел, что Java, PHP и некоторые другие языки программирования поддерживают md5. Например, в PHP вам просто нужно позвонить: md5("your string");.

Подойдет простая хеш-функция. (Если возможно, пожалуйста, включите простой код о том, как его использовать.)

Ответы [ 3 ]

11 голосов
/ 01 июня 2011

Это просто.С C ++ 11 вы получаете

hash<string>

функтор , который вы можете использовать следующим образом (не проверено, но дает вам идею):

hash<string> h;
const size_t value = h("mystring");

Еслиу вас нет C ++ 11, посмотрите на boost, возможно boost::tr1::hash_map.Вероятно, они также предоставляют функцию хеширования строк.

Для очень простых случаев вы можете начать с чего-то следующего:

size_t h = 0
for(int i=0; i<s.size(); ++i)
    h = h*31 + s[i];
return h;

Чтобы перейти к комментарию ниже.Чтобы предотвратить кластеризацию коротких строк, вы можете инициализировать h по-другому.Может быть, вы можете использовать длину для этого (но это только моя первая идея, бездоказательная):

size_t h = numeric_limits::max<size_t>() / (s.length()+1); // +1: no div-by-0
...

Это не должно быть хуже, чем прежде, но все еще далеко от совершенства.

8 голосов
/ 01 июня 2011

Это зависит от того, какая версия C ++ у вас есть ... и какую хеш-функцию вы ищете.

C ++ 03 не имеет контейнера для хеширования и, следовательно, не требует хеширования.Однако ряд компиляторов предлагают собственные заголовки.В противном случае может помочь Boost.Functional.Hash.

C ++ 0x имеет семейство контейнеров unordered_ и, следовательно, предикат std::hash, который уже работает для стандартных типов C ++ (встроенных типов и std::string, по крайней мере).

Однако это простой хеш, достаточно подходящий для хеш-карт, не для безопасности .

Если вы ищете криптографический хеш, тогда проблема совершенно иная (а md5 - бесполезный), и вам понадобится библиотека для (например) хэша SHA-2.

Если вы ищете скорость, посмотрите CityHash и MurmurHash .Оба имеют ограничения, но они сильно оптимизированы.

4 голосов
/ 01 июня 2011

Как насчет использования boost, Boost.Functional / Hash

...