Cобсвенно сабж, то есть хочется с минимальными строчко-затратами сделать так, чтобы вычисление хеша для const_string<char> было аналогично std::string.
Пока скопипастил из сорцов STL для VS2005 и получил такой функтор.
struct hash_const_string
{
private:
template <class _Init>
inline size_t hash_value(_Init _Begin, _Init _End) const
{ // hash range of elements
size_t _Val = 2166136261U;
while(_Begin != _End)
_Val = 16777619U * _Val ^ (size_t)*_Begin++;
return (_Val);
}
public:
enum
{ // parameters for hash table
bucket_size = 4, // 0 < bucket_size
min_buckets = 8}; // min_buckets = 2 ^^ N, 0 < N
size_t operator() (const const_string& strKey) const
{
ldiv_t _Qrem = ldiv((long)hash_value(strKey.begin(), strKey.end()), 127773);
_Qrem.rem = 16807 * _Qrem.rem - 2836 * _Qrem.quot;
if (_Qrem.rem < 0)
_Qrem.rem += 2147483647;
return ((size_t)_Qrem.rem);
}
bool operator() (const const_string& strKey1, const const_string& strKey2) const
{
return !strKey1.compare(strKey2);
}
};
Смущает наличие енумов bucket_size и min_buckets, которых нету в sl1port'е (пока компилил под 2005 -- до gcc и stlport руки еще не дошли).
Про то что hash_map не входит в стандарт STL, а является добровольным расширением я знаю. Но все же, насколько реализации STL соответствуют друг другу относительно hash_map?
PS Для тех кто не знает что такое const_string милости просим сюды:
const_string<>... << RSDN@Home 1.2.0 alpha rev. 655>>