как правильно и кросплатформенно подружить const_string и st
От: CiViLiS Россия  
Дата: 28.09.06 12:40
Оценка:
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&lt;&gt;
... << RSDN@Home 1.2.0 alpha rev. 655>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.