Это просто.С 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
...
Это не должно быть хуже, чем прежде, но все еще далеко от совершенства.