| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2208 人关注过本帖
标题:关于汉字hash问题
取消只看楼主 加入收藏
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
结帖率:86.67%
收藏
已结贴  问题点数:20 回复次数:6 
关于汉字hash问题
二、对汉字进行hash
    为了处理汉字的方便,在查找汉字的时候,我们通常会用到hash的方法,那怎么来确定一个汉字位置呢?这就和每种编码的排列有关了,这里主要给出一种hash函数的策略。
    对于GB2312编码,设输入的汉字为GBword,我们可以采用公式(C1-176)*94 + (C2-161)确定GBindex。其中,C1表示第一字节,C2表示第二字节。具体如下:
    GBindex = ((unsigned char)GBword.at(0)-176)*94 + (unsigned char)GBword.at(1) - 161;
    之所以用unsigned char类型,是因为char是一个字节,如果用unsigend int,因为int是4个字节的,所以会造成扩展,导致错误。
       对于GBK编码,设输入的汉字为GBKword,则可以采用公式   index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128),其中ch1是第一字节,ch2是第二字节。
    具体的,
    GBKindex = ((unsigned char)GBKword[0]-129)*190 +
               ((unsigned char)GBKword[1]-64) - (unsigned char)GBKword[1]/128;

如上是我在网上找到的,里面对汉字hash的方法没有详细的说明,我自己看不出到底是什么原理的,有人知道不??希望能够清楚点,如(C1-176)*94为什么用94乘?
搜索更多相关主题的帖子: hash 汉字 
2010-05-25 22:01
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
恩,GB2312的94我明白了,能解释下别的吗?
如(C1-176)*94 + (C2-161)中为什么是减176,和减161
还有GBK的index=(ch1-0x81)*190+(ch2-0x40)-(ch2/128)也能解释一下吗?
2010-05-27 07:54
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
没人了解这个吗?
2010-05-31 20:30
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
还有(unsigned char)GBKword[1]/128 为什么要除128,这样不就有小数了么?
2010-06-02 14:34
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
在GB2312中的为什么么是C2-161,而不是C2-160?怎么要多减1啊?
2010-06-03 15:45
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
有点急,虽然不是很急,那个为什么是161,不是应该是160的样子吗?
2010-06-05 14:59
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
收藏
得分:0 
回复 9楼 hzh512
呵呵,原来是这样啊,呵呵,谢谢了,这个终于清楚了!
2010-06-05 19:18
快速回复:关于汉字hash问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032311 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved