工大人在上海
做为c++菜鸟也要嗷嗷飞!
posts - 25,comments - 10,trackbacks - 0
   今天在研究SGI STL中的hashtable时有一点疑问一直没有想明白。

   hashtable使用hash function来计算元素位置。但是sgi使用另外一个函数bkt_num()来完成这个任务,有这个函数来调用hash function来取得一个可以对hashtable进行取模运算的值,对于char,int,long等只需要返回其值即可。但是对于string,sgi设计了一个转换函数如下:

   
template <class _Key> struct hash { };

inline size_t __stl_hash_string(
const char* __s)
{
  unsigned 
long __h = 0
  
for ( ; *__s; ++__s)
    __h 
= 5*__h + *__s;
  
  
return size_t(__h);
}


   这里的__h = 5*__h + *__s应该是把字符串转变成了一个long型的变量,但是采用这样的的运算进行转变有什么好处呢?为什么要乘5呢?

   希望能有达人解释一下。。。。

   也希望能够在网上搜到答案
posted on 2007-04-04 17:23 天下大事 必作于细 阅读(569) 评论(3) 编辑 收藏

FeedBack:
2007-04-04 18:24 | aaa[未注册用户]
不乘5的话, 两个字符相同但顺序不同的字符串的hashcode是相同的, 显然不行, 为什么乘五就不知道了.....
 回复 引用   
#2楼[楼主]
2007-04-04 19:49 | 天下大事 必作于细      
谢谢评论,但我就是不知道为什么非要乘5啊,为什么不选择其他数字呢?
 回复 引用 查看   
2010-11-19 14:29 | borrows      
怎么使用hashtable 啊?
 回复 引用 查看