鱼C论坛

 找回密码
 立即注册
查看: 2840|回复: 4

stl 哈希函数

[复制链接]
发表于 2013-8-23 22:34:23 | 显示全部楼层 |阅读模式
100鱼币
  函数原型:   inline  size_t  __stl_hash_string(const char* s)
  {
        unsigned long h=0;
        for ( ; *s; ++s)
           h = 5 * h + *s;
       return size_t (h);
}

求字符窜映射K值的算法分析

最佳答案

查看完整内容

其实,从整体上考虑,假设unsigned long只有4个字节,32比特。那么它就只能表示2^32这么多个不同的数。接着考虑字符串 ,假设字符串里的字符都是小写的英文字符,那么每个字符有a~z 26种选择。32个字符组成的字符串,就有26^32种,明显字符串的数目多于 unsigned long能表示的数目。那么肯定存在多个不同字符串算出来的整型hash值相同。 为了研究这个复杂的问题,科学家对很多的字符串进行测试,希望找到一个hash函数,让每个整 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-23 22:34:24 | 显示全部楼层
其实,从整体上考虑,假设unsigned long只有4个字节,32比特。那么它就只能表示2^32这么多个不同的数。接着考虑字符串 ,假设字符串里的字符都是小写的英文字符,那么每个字符有a~z  26种选择。32个字符组成的字符串,就有26^32种,明显字符串的数目多于 unsigned long能表示的数目。那么肯定存在多个不同字符串算出来的整型hash值相同。
为了研究这个复杂的问题,科学家对很多的字符串进行测试,希望找到一个hash函数,让每个整数代表的字符串数目尽量一样(比如:10能表示100个不同的字符串。20也差不多能表示100个不同的字符串),这样当你需要反过来将整数恢复成字符串的时候,就只需要遍历这100个字符串,哪怕运气再差也只要遍历100次就能找到你要的字符串。
这里的用5的原因涉及到复杂的统计学原理,但是有个结论,就是,这里用较小的素数都是可以的,比如不用5,用7,也差不多;但是用4,就很不好。如果LZ想 具体研究,可以搜索下“哈希函数”,有很多的 论文都在讨论这个问题,这也从一个侧面说明了这个问题并没有被完美的解决。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-23 22:39:43 | 显示全部楼层
求为什么乘以5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-8-24 11:41:59 | 显示全部楼层
你要乘多少都可以,只是一个过程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-8-24 13:39:50 | 显示全部楼层
晕乘以1也行?  比如0 的 A码30 + 31 不是一个 a  了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-6-9 01:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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