游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2467|回复: 1

谁知道SLT Ext 中hash_map的hash函数的方法?

[复制链接]

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
发表于 2004-10-30 15:52:00 | 显示全部楼层 |阅读模式
那个hash_map的默认hasn函数是怎样的呢?

比如我分别定义了

hash_map<string, MyClass>
hash_map<char *, MyClass>
hash_map<int, MyClass>
hash_map<char, MyClass>
hash_map<CString, MyClass>

其中string是STL的字符串类型,CString是MFC的字符类(这里只是举个例子,不要对MFC发表其他意见,呵呵)

我想知道STL Ext对这些Key到底使用什么样的hash函数?

89

主题

822

帖子

847

积分

高级会员

Rank: 4

积分
847
 楼主| 发表于 2004-11-2 17:55:00 | 显示全部楼层

Re: 谁知道SLT Ext 中hash_map的hash函数的方法?

看了一下代码,不知道我的理解对不对

STD.NET的hash算法都在构造函数里,hash table都是存储的vector里的

构造函数一共有4个,针对std的string,char *,wchar *,其他类型

        size_t hash_value(const _STD basic_string<_Elem, _Traits, _Alloc>& _Str)
        {        // hash string to size_t value
        typedef typename _STD basic_string<_Elem, _Traits, _Alloc>::size_type _Strsize;

        size_t _Val = _HASH_SEED;
        _Strsize _Size = _Str.size();
        if (0 < _Size)
                {        // add one or more elements
                _Strsize _Stride = (_Size / 16) + 1;
                _Size -= _Stride;        // protect against _Size near _Str.max_size()
                for(_Strsize _Idx = 0; _Idx <= _Size; _Idx += _Stride)
                        _Val += (size_t)_Str[_Idx];
                }
        return (_Val);
        }

template<class _Kty> inline
        size_t hash_value(const _Kty& _Keyval)
        {        // hash _Keyval to size_t value one-to-one
        return ((size_t)_Keyval ^ _HASH_SEED);
        }

inline size_t hash_value(const char *_Str)
        {        // hash NTBS to size_t value
        typedef size_t _Strsize;

        size_t _Val = _HASH_SEED;
        _Strsize _Size = ::strlen(_Str);
        if (0 < _Size)
                {        // add one or more elements
                _Strsize _Stride = (_Size / 16) + 1;
                _Size -= _Stride;        // protect against _Size near _Str.max_size()
                for(_Strsize _Idx = 0; _Idx <= _Size; _Idx += _Stride)
                        _Val += (size_t)_Str[_Idx];
                }
        return (_Val);
        }

inline size_t hash_value(const wchar_t *_Str)
        {        // hash NTWCS to size_t value
        typedef size_t _Strsize;

        size_t _Val = _HASH_SEED;
        _Strsize _Size = ::wcslen(_Str);
        if (0 < _Size)
                {        // add one or more elements
                _Strsize _Stride = (_Size / 16) + 1;
                _Size -= _Stride;        // protect against _Size near _Str.max_size()
                for(_Strsize _Idx = 0; _Idx <= _Size; _Idx += _Stride)
                        _Val += (size_t)_Str[_Idx];
                }
        return (_Val);
        }

不知道大家对这个有什么看法
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 02:11

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表