怎样写这么的一个哈希函数

SKATE11 2012-09-11 09:06:28
写一个哈希函数用来存储单词 怎样写才能保证每个单词都是唯一的 相同的单词可以存储在一起
...全文
391 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiandingzhe 2012-09-17
  • 打赏
  • 举报
回复

#include <stdint.h>

// 假定单词都是小写的

uint64_t exp_i(int base, int scale)
{
uint64_t result = 1;
for (int i=0; i<scale; i++) result *= base;
return result;
}

uint64_t word_hash(const char* str)
{
uint64_t result = 0;

for (int i=0; str[i]!=0; i++) {
int num = str[i]-'a';
result += num * exp_i(26,i);
}

return result;
}
jiandingzhe 2012-09-17
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

引用 17 楼 的回复:

能写出来这么一个通用的有意义的算法的话,你一定可以得诺贝尔数学奖。
还是把教材拿出来,重新看看hash是怎么回事吧。

我只是要写这么个函数 不要存储 不要解决冲突 只要每个单词是独一无二的 也不可以吗
[/Quote]
当然可以,但是这种函数通常没多大用。
你可以把一个单词看成一个26进制的整数,然后就完了。这样做的缺点是存储空间非常稀疏,浪费极大。
SKATE11 2012-09-15
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

能写出来这么一个通用的有意义的算法的话,你一定可以得诺贝尔数学奖。
还是把教材拿出来,重新看看hash是怎么回事吧。
[/Quote]
我只是要写这么个函数 不要存储 不要解决冲突 只要每个单词是独一无二的 也不可以吗
ForestDB 2012-09-15
  • 打赏
  • 举报
回复
忘了hash吧,LZ的需求,map足已。
sjjwind 2012-09-15
  • 打赏
  • 举报
回复
经典的hash函数

unsigned int SDBMHash( char * str)
{
unsigned int hash = 0 ;

while ( * str)
{
hash = ( * str ++ ) + (hash << 6 ) + (hash << 16 ) - hash;
}

return (hash & 0x7FFFFFFF );
}


你要存储单词还不如用trie树呢。
taodm 2012-09-15
  • 打赏
  • 举报
回复
有得诺贝尔奖的雄心总是好的。
但是,还是自己去认真看教材吧。
jiandingzhe 2012-09-15
  • 打赏
  • 举报
回复
理论上讲,hash函数通常都不保证唯一。
因为hash函数通常都是数据签名的路子,即用一个短的数据来描述一个长的数据。这当中几乎肯定存在信息损失,也就是说,多样性的丧失(hash值的种类比key的种类少)。那么就几乎肯定存在hash冲突。
如果hash函数完全不冲突,那么说明产生的hash值和hash的key有一样的多样性。这样的hash函数只在及其有限的情景下有用。
Star-light 2012-09-15
  • 打赏
  • 举报
回复
用map不行吗?
SKATE11 2012-09-14
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
楼主,你就不要继续逗笑了。hash要能有解决冲突的方法,还要开环、闭环什么的干嘛,你以为那是吃饱了撑的?
你要的是stl/boost等库里现成的hash_map。


引用 12 楼 的回复:
你们都不理解我的意思啊 我是想求出一个文件中每个单词出现次数 所以要写这么个哈希函数作为辅助
以使得我写的哈希哈数遇到相同的单词时能直接把它的count加1 所以相同的单词得到相同的哈希结果,不……
[/Quote]我只要不同的单词计算出的哈希地址不同 难道写不出这样的哈希函数吗
taodm 2012-09-14
  • 打赏
  • 举报
回复
能写出来这么一个通用的有意义的算法的话,你一定可以得诺贝尔数学奖。
还是把教材拿出来,重新看看hash是怎么回事吧。
SKATE11 2012-09-13
  • 打赏
  • 举报
回复
你们都不理解我的意思啊 我是想求出一个文件中每个单词出现次数 所以要写这么个哈希函数作为辅助
以使得我写的哈希哈数遇到相同的单词时能直接把它的count加1 所以相同的单词得到相同的哈希结果,不同的单词计算出的哈希结果都应该不同,就是这么个意思。 该怎么写啊
taodm 2012-09-13
  • 打赏
  • 举报
回复
楼主,你就不要继续逗笑了。hash要能有解决冲突的方法,还要开环、闭环什么的干嘛,你以为那是吃饱了撑的?
你要的是stl/boost等库里现成的hash_map。

[Quote=引用 12 楼 的回复:]
你们都不理解我的意思啊 我是想求出一个文件中每个单词出现次数 所以要写这么个哈希函数作为辅助
以使得我写的哈希哈数遇到相同的单词时能直接把它的count加1 所以相同的单词得到相同的哈希结果,不同的单词计算出的哈希结果都应该不同,就是这么个意思。 该怎么写啊
[/Quote]
zjwzcnjsy 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

引用 12 楼 的回复:

你们都不理解我的意思啊 我是想求出一个文件中每个单词出现次数 所以要写这么个哈希函数作为辅助
以使得我写的哈希哈数遇到相同的单词时能直接把它的count加1 所以相同的单词得到相同的哈希结果,不同的单词计算出的哈希结果都应该不同,就是这么个意思。 该怎么写啊

像2楼这样子的哈希。
这个问题也可以用字典树。
[/Quote]

2楼->4楼
zjwzcnjsy 2012-09-13
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

你们都不理解我的意思啊 我是想求出一个文件中每个单词出现次数 所以要写这么个哈希函数作为辅助
以使得我写的哈希哈数遇到相同的单词时能直接把它的count加1 所以相同的单词得到相同的哈希结果,不同的单词计算出的哈希结果都应该不同,就是这么个意思。 该怎么写啊
[/Quote]
像2楼这样子的哈希。
这个问题也可以用字典树。
taodm 2012-09-12
  • 打赏
  • 举报
回复
楼主,你这是执意要挑战诺贝尔数学奖?
这直接违背hash的根本原理啊。
Corner 2012-09-12
  • 打赏
  • 举报
回复
哈希函数不就是这个功能么……你搜下经典哈希函数直接拿来用好了
SKATE11 2012-09-12
  • 打赏
  • 举报
回复
我说白了吧 就是希望写个哈希函数统计每个单词出现的次数 需要这么个哈希函数能区分开不同的单词
SKATE11 2012-09-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
相同的单词存储在一起是什么意思?
[/Quote]
我的意思函数必须能区分不同单词 相同的单词可以允许冲突
SKATE11 2012-09-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
每个单词的hash值一般都是唯一的
[/Quote]
是要唯一的 问题是怎样写这个函数啊 方法用的不对的话 肯定会产生冲突诶
SKATE11 2012-09-12
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
哈希函数不就是这个功能么……你搜下经典哈希函数直接拿来用好了
[/Quote]
但是怎样写啊 比如单词“name” 我应该怎样写这个哈希函数来求出它的地址,才能保证其他单词用这个哈希函数求出的地址不与这个单词的相同。
加载更多回复(5)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧