求一个处理中文的哈希函数

问题描述

网上和书上都有关于数字的哈希函数的设计,但对于中文汉字的哈希函数资料很少,求一个哈希函数,实现给出一个词语串,如:“中国 人”,通过该哈希函数给出哈希地址。即h(中国 人)=一个地址。谢谢!

解决方案

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;
解决方案二:
汉字编码中现在主要用到的有三类,包括GBK,GB2312和Big5。 1、GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范,当然也包括其他的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个。我们平时说6768个汉字,实际上里边有5个编码为空白,所以总共有6763个汉字。 GB2312规定“对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示”,习惯上称第一个字节为“高字节”,第二个字节为“低字节”。GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十进制为160-254)。 GB2312将代码表分为94个区,对应第一字节(0xa1-0xfe);每个区94个位(0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87区为汉字区(0xb0-0xf7),10-15区、88-94区是有待进一步标准化的空白区。 2、Big5又称大五码,主要为香港与台湾使用,即是一个繁体字编码。每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE(即129-255),共126种。第二个字节的范围不连续,分别为0X40-0X7E(即64-126),0XA1-0XFE(即161-254),共157种。 3、GBK是GB2312的扩展,是向上兼容的,因此GB2312中的汉字的编码与GBK中汉字的相同。另外,GBK中还包含繁体字的编码,它与Big5编码之间的关系我还没有弄明白,好像是不一致的。GBK中每个汉字仍然包含两个字节,第一个字节的范围是0x81-0xFE(即129-254),第二个字节的范围是0x40-0xFE(即64-254)。GBK中有码位23940个,包含汉字21003个。 表1 汉字编码范围名称 第一字节 第二字节 GB2312 0xB0-0xF7(176-247) 0xA0-0xFE(160-254) GBK 0x81-0xFE(129-254) 0x40-0xFE(64-254) Big5 0x81-0xFE(129-255) 0x40-0x7E(64-126)0xA1-0xFE(161-254)
解决方案三:
用的什么语言?如果是ruby可以直接实现你的需要。或者自己写一个函数,思路如下:获取到key后,判断是否ascii,是则直接赋值,不是则转为16进制的编码,将此编码做为key。这样就OK了。
解决方案四:
一个最简单的方法,把中文字符串按8位分隔成一个单元(下面以16进制为例,%表示取余),比如分隔成以下:假设一个字符串分成了以下单元12,7A,F6,3A,.......然后我们来计算((12*FF+7A)%FFFF+(F6*FF+3A)%FFFF+.....)%FFF
解决方案五:
为什么要用中文做呢,中文在程序中永远是个让人不放心的钉子..我以前枚举用了个中文,到现在,还在担心...不建议使用中文做,书名可以是中文 但是确实该转了在做..
解决方案六:
可不可以把中文转成acsii的编码,在对那个编码进行每个字节的hashcode,英文的hashcode总会是到处都找得到的。

时间: 2024-12-03 16:14:10

求一个处理中文的哈希函数的相关文章

调用-求大神帮我写一个修改datagridview式样的公共函数

问题描述 求大神帮我写一个修改datagridview式样的公共函数 由于datagridview比较多,对每一个设置行列宽度,以及表头颜色等比较烦,希望能写一个全局函数,在后面调用这个全局函数即可.急需..谢谢 解决方案 http://blog.csdn.net/yitoushengkou/article/details/25685515 帮你找了个. 解决方案二: 这个写一个Util静态类吧 解决方案三: 帮你写了一个简单的静态类,来实现通用的设置,调用为gdv.DataGridViewSt

求一个哈希表遍历key 的 方法

问题描述 求一个哈希表遍历key 的 方法 把1 2 3 4 5 遍历出来 然后调用 gethar 方法都得到相应的vaule 就可以啦 解决方案 hash表的key不是顺序的. 解决方案二: for(Entry entry : hm.entrySet()) { //打印Key System.out.println(entry.getKey()); //打印value System.out.println(entry.getValue()); }

编程c语言-求一个把bmp图像灰度化并把灰度化后的像素存入数组里的C语言函数,不用opencv

问题描述 求一个把bmp图像灰度化并把灰度化后的像素存入数组里的C语言函数,不用opencv 求一个把bmp图像灰度化并把灰度化后的像素存入数组里的C语言函数,不用opencv 解决方案 顶顶顶顶顶顶顶顶顶顶

求一个 可以用 php preg_match()函数 的正则

问题描述 求一个 可以用 php preg_match()函数 的正则 求一个 可以用 php preg_match()函数 验证字符串自能包含 中英文,数字,还有'-','_' 的正则 解决方案 [u4e00-u9fa5a-zA-Z0-9-_]+ 解决方案二: [-u4e00-u9fa5w]+ 解决方案三: preg_match( '/[x{4e00}-x{9fa5}w-]+/u', $subject, $arr); 解决方案四: 答案有点错误,php正确的正则是 /^[x{4e00}-x{9

求一个C/C++的重采样函数,只要能完成48K<->24K之间的升降采样就行

问题描述 求一个C/C++的重采样函数,只要能完成48K<->24K之间的升降采样就行 求大神给一个C/C++的音频重采样函数,只要能完成48K<->24K之间的升降采样就行,最好是给好函数原型我加到程序里面直接就能调用,多谢多谢!!!

求一个在字符串中识别括号并删除括号及其中内容的函数

问题描述 求一个在字符串中识别括号并删除括号及其中的内容的函数括号包括 大中小 3种括号.输入为 1个字符串 s="我是一个人(中国人)[真的]{确定}";输出为 result = "我是一个人"; 解决方案 String s="我是一个人(中国人)aaa[真的]bbbb{确定}"; s=s.replaceAll("\(.*?\)|\{.*?}|\[.*?]|(.*?)", "");System.out.p

高分求一个psd+html的网页模板,要求中文、易修改、简单、有明确主题、有网页基本构件(导航啦,底部

问题描述 高分求一个psd+html的网页模板,要求中文.易修改.简单.有主题.有网页基本构件(导航啦,底部啦,链接等)有的话,请发到我邮箱highpr#126.com,谢谢了,地址中#改成@,防止垃圾信息版主手下留情,实在不行就改到非技术区吧这个帖子也可以回答: 解决方案 本帖最后由 highpr 于 2012-01-15 15:13:14 编辑解决方案二:网上多的是啊http://www.mobanwang.com/mb/special/cn/http://www.drame.cn/解决方案

控件-mscomm串口波形绘制范例,求大神解析这三个函数,急急急,绘制波形图的原理是什么,拜托了

问题描述 mscomm串口波形绘制范例,求大神解析这三个函数,急急急,绘制波形图的原理是什么,拜托了 //串口void CPort_testDlg::OnComm() { //if(stop)return; VARIANT m_input1; COleSafeArray m_input2; long lengthi; BYTE data[600]; CString str; int ai=0bi=0ci=0di=0; int sum=0; if(m_Comm.GetCommEvent()==2)

Oracle中利用哈希函数提高查询速度

oracle|函数|速度 当数据存储在一个普通表中的时候,这些记录将以插入到数据库时的顺序物理地保存到分配的块中.例如,如果有一个用于存储员工信息的表,那么员工姓名将会按照插入到表的顺序存储在表中. 如果员工记录非常多的话,那么数据表的响应速度就会逐渐变慢.你可以通过选择值相对等分布的一列(如员工的部门编号)并建立一个簇表来提高查询员工的速度. 在簇表中,如果员工属于同一个部门,那么它们的记录将物理地存储在同一系列的块中.这样就可以提高查找员工信息的速度,这是因为在检索某个特定部门的员工时,需要