标题:关于汉字hash问题
只看楼主
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
结帖率:86.67%
已结贴  问题点数:20 回复次数:9 
关于汉字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
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
得分:20 
在标准的汉字编码表中有94行、94列。其行号称为区号,列号称为位号。
GB2312 80(又称为国标码)中共有7445个字符符号: 汉字符号6763个 一级汉字3755个(按汉语拼音字母顺序排列) 二级汉字3008个(按部首笔划顺序排列) 非汉字符号682个 GB2312 80规定,所有的国标码汉字及符号组成一个94 94的方阵。在此方阵中,每一行称为一个"区",每一列称为一个"位"。这个方阵实际上组成一个有94个区(编号由01到94),每个区有94个位(编号 由01到94)的汉字字符集。 一个汉字所在的区号和位号的组合就构成了该汉字的"区位码"。其中,高两位为区号,低两位为位号。这样区位码可以唯一地确定某一汉字或字符;反之,任何一 个汉字或符号都对应一个唯一的区位码,没有重码。

编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-05-26 09:09
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
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
得分:0 
如果你知道ASCII码为(0xxxxxxx)b开头那个bit必须为0,那么其他就好解释。所以为了和ASCII码区分开,必须要求汉字高字节要大于128,即(1xxxxxxx),在汉字标准中规定                                   
                    汉字编码范围
 名称             高字节                  低字节
GB2312     0xB0-0xF7(176-247)      0xA0-0xFE(160-254)
GBK        0x81-0xFE(129-254)    0x40-0xFE(64-254)
在这里你就明白为什么有 176 161了,这是在确定行号和列号。GBK一样理解。

但在GBK中删除了 XX7F 这一列,而7F正好是127,这相当于空出了一列,也就是多了一列。所以在hash的时候,要减去。(可参考GBK编码细则)http://www.
 

 

编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-06-02 17:08
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
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
得分:0 
不好意思写错了,低字节是从0xA1 开始的,所以是161

编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-06-05 19:13
wingfeng
Rank: 2
等 级:论坛游民
帖 子:292
专家分:10
注 册:2008-12-12
得分:0 
回复 9楼 hzh512
呵呵,原来是这样啊,呵呵,谢谢了,这个终于清楚了!
2010-06-05 19:18



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-308162-1-1.html




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

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