- 浏览: 274638 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
86614009:
如何在service层,如何获取绑定到当前线程的entitna ...
使用spring的OpenEntityManagerInView -
yajunyajun2011:
好帖子 怎么没人顶呢
Java 正则表达式最大,最小匹配问题 -
xtuali:
能说明一下,你的nutch是哪个版本的吗?谢谢!
搜索引擎Nutch源代码研究之一 网页抓取(1) -
dongmusic:
需要学习这么多的东西,吐血中...
如何提高Java开发能力 -
jiminsc:
cool
LDAP 验证、添加、修改、删除(转)
算法:
JAVA版:
C版:
C++版:
实际应用
以上就是一些关于hash以及其相关的一些基本预备知识。那么在emule里面他具体起到什么作用呢?
大家都知道emule是基于P2P (Peer-to-peer的缩写,指的是点对点的意思的软件),它采用了"多源文件传输协议”(MFTP,the Multisource FileTransferProtocol)。在协议中,定义了一系列传输、压缩和打包还有积分的标准,emule对于每个文件都有md5-hash的算法设置,这使得该文件独一无二,并且在整个网络上都可以追踪得到。
什么是文件的hash值呢?
MD5-Hash-文件的数字文摘通过Hash函数计算得到。不管文件长度如何,它的Hash函数计算结果是一个固定长度的数字。与加密算法不同,这一个Hash算法是一个不可逆的单向函数。采用安全性高的Hash算法,如MD5、SHA时,两个不同的文件几乎不可能得到相同的Hash结果。因此,一旦文件被修改,就可检测出来。
当我们的文件放到emule里面进行共享发布的时候,emule会根据hash算法自动生成这个文件的hash值,他就是这个文件唯一的身份标志,它包含了这个文件的基本信息,然后把它提交到所连接的服务器。当有他人想对这个文件提出下载请求的时候,这个hash值可以让他人知道他正在下载的文件是不是就是他所想要的。尤其是在文件的其他属性被更改之后(如名称等)这个值就更显得重要。而且服务器还提供了,这个文件当前所在的用户的地址,端口等信息,这样emule就知道到哪里去下载了。
一般来讲我们要搜索一个文件,emule在得到了这个信息后,会向被添加的服务器发出请求,要求得到有相同hash值的文件。而服务器则返回持有这个文件的用户信息。这样我们的客户端就可以直接的和拥有那个文件的用户沟通,看看是不是可以从他那里下载所需的文件。
对于emule中文件的hash值是固定的,也是唯一的,它就相当于这个文件的信息摘要,无论这个文件在谁的机器上,他的hash值都是不变的,无论过了多长时间,这个值始终如一,当我们在进行文件的下载上传过程中,emule都是通过这个值来确定文件。
那么什么是userhash呢?
道理同上,当我们在第一次使用emule的时候,emule会自动生成一个值,这个值也是唯一的,它是我们在emule世界里面的标志,只要你不卸载,不删除config,你的userhash值也就永远不变,积分制度就是通过这个值在起作用,emule里面的积分保存,身份识别,都是使用这个值,而和你的id和你的用户名无关,你随便怎么改这些东西,你的userhash值都是不变的,这也充分保证了公平性。其实他也是一个信息摘要,只不过保存的不是文件信息,而是我们每个人的信息。
哈希表不可避免冲突(collision)现象:对不同的关键字可能得到同一哈希地址即key1≠key2,而hash(key1)=hash(key2)。具有相同函数值的关键字对该哈希函数来说称为同义词(synonym)。因此,在建造哈希表时不仅要设定一个好的哈希函数,而且要设定一种处理冲突的方法。可如下描述哈希表:根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集(区间)上并以关键字在地址集中的“象”作为相应记录在表中的存储位置,这种表被称为哈希表。 对于动态查找表而言,1)表长不确定;2)在设计查找表时,只知道关键字所属范围,而不知道确切的关键字。因此,一般情况需建立一个函数关系,以f(key)作为关键字为key的录在表中的位置,通常称这个函数f(key)为哈希函数。(注意:这个函数并不一定是数学函数)
哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可。
现实中哈希函数是需要构造的,并且构造的好才能使用的好。
用途:加密,解决冲突问题。。。。 用途很广,比特精灵中就使用了哈希函数,你可 以自己看看。 具体可以学习一下数据结构和算法的书。
while(*key)//遍历字符串 { h=(h<<4)+*key++;//把h左移4位加上该字符付给h unsigned long g=h&0Xf0000000L; //取h的高四位付给g if(g) h^=g>>24;//如果g不为0,让h和g的高八位异或再付给h h&=~g;//对g取反并与h相与付给h } return h%MOD; //得到哈希值返回
JAVA版:
public long ELFHash(String str) { long hash = 0; long x = 0; for(int i = 0; i < str.length(); i++) { hash = (hash << 4) + str.charAt(i); if((x = hash & 0xF0000000L) != 0) { hash ^= (x >> 24); } hash &= ~x; } return hash; }
C版:
unsigned int ELFHash(char* str, unsigned int len) { unsigned int hash = 0; unsigned int x = 0; unsigned int i = 0; for(i = 0; i < len; str++, i++) { hash = (hash << 4) + (*str); if((x = hash & 0xF0000000L) != 0) { hash ^= (x >> 24); } hash &= ~x; } return hash; }
C++版:
unsigned int ELFHash(const std::string& str) { unsigned int hash = 0; unsigned int x = 0; for(std::size_t i = 0; i < str.length(); i++) { hash = (hash << 4) + str[i]; if((x = hash & 0xF0000000L) != 0) { hash ^= (x >> 24); } hash &= ~x; } return hash; }
实际应用
以上就是一些关于hash以及其相关的一些基本预备知识。那么在emule里面他具体起到什么作用呢?
大家都知道emule是基于P2P (Peer-to-peer的缩写,指的是点对点的意思的软件),它采用了"多源文件传输协议”(MFTP,the Multisource FileTransferProtocol)。在协议中,定义了一系列传输、压缩和打包还有积分的标准,emule对于每个文件都有md5-hash的算法设置,这使得该文件独一无二,并且在整个网络上都可以追踪得到。
什么是文件的hash值呢?
MD5-Hash-文件的数字文摘通过Hash函数计算得到。不管文件长度如何,它的Hash函数计算结果是一个固定长度的数字。与加密算法不同,这一个Hash算法是一个不可逆的单向函数。采用安全性高的Hash算法,如MD5、SHA时,两个不同的文件几乎不可能得到相同的Hash结果。因此,一旦文件被修改,就可检测出来。
当我们的文件放到emule里面进行共享发布的时候,emule会根据hash算法自动生成这个文件的hash值,他就是这个文件唯一的身份标志,它包含了这个文件的基本信息,然后把它提交到所连接的服务器。当有他人想对这个文件提出下载请求的时候,这个hash值可以让他人知道他正在下载的文件是不是就是他所想要的。尤其是在文件的其他属性被更改之后(如名称等)这个值就更显得重要。而且服务器还提供了,这个文件当前所在的用户的地址,端口等信息,这样emule就知道到哪里去下载了。
一般来讲我们要搜索一个文件,emule在得到了这个信息后,会向被添加的服务器发出请求,要求得到有相同hash值的文件。而服务器则返回持有这个文件的用户信息。这样我们的客户端就可以直接的和拥有那个文件的用户沟通,看看是不是可以从他那里下载所需的文件。
对于emule中文件的hash值是固定的,也是唯一的,它就相当于这个文件的信息摘要,无论这个文件在谁的机器上,他的hash值都是不变的,无论过了多长时间,这个值始终如一,当我们在进行文件的下载上传过程中,emule都是通过这个值来确定文件。
那么什么是userhash呢?
道理同上,当我们在第一次使用emule的时候,emule会自动生成一个值,这个值也是唯一的,它是我们在emule世界里面的标志,只要你不卸载,不删除config,你的userhash值也就永远不变,积分制度就是通过这个值在起作用,emule里面的积分保存,身份识别,都是使用这个值,而和你的id和你的用户名无关,你随便怎么改这些东西,你的userhash值都是不变的,这也充分保证了公平性。其实他也是一个信息摘要,只不过保存的不是文件信息,而是我们每个人的信息。
哈希表不可避免冲突(collision)现象:对不同的关键字可能得到同一哈希地址即key1≠key2,而hash(key1)=hash(key2)。具有相同函数值的关键字对该哈希函数来说称为同义词(synonym)。因此,在建造哈希表时不仅要设定一个好的哈希函数,而且要设定一种处理冲突的方法。可如下描述哈希表:根据设定的哈希函数H(key)和所选中的处理冲突的方法,将一组关键字映象到一个有限的、地址连续的地址集(区间)上并以关键字在地址集中的“象”作为相应记录在表中的存储位置,这种表被称为哈希表。 对于动态查找表而言,1)表长不确定;2)在设计查找表时,只知道关键字所属范围,而不知道确切的关键字。因此,一般情况需建立一个函数关系,以f(key)作为关键字为key的录在表中的位置,通常称这个函数f(key)为哈希函数。(注意:这个函数并不一定是数学函数)
哈希函数是一个映象,即:将关键字的集合映射到某个地址集合上,它的设置很灵活,只要这个地址集合的大小不超出允许范围即可。
现实中哈希函数是需要构造的,并且构造的好才能使用的好。
用途:加密,解决冲突问题。。。。 用途很广,比特精灵中就使用了哈希函数,你可 以自己看看。 具体可以学习一下数据结构和算法的书。
发表评论
-
有理想的程序员必须知道的15件事(转自CSDN)
2011-07-21 21:23 571作为程序员,要取得非凡成就需要记住的15件事。 1.走一条不 ... -
每天写出好代码的5个建议(转自CSDN)
2011-07-21 21:18 535成为一个优秀的程序员 ... -
程序员技术练级攻略(转自CSDN)
2011-07-21 21:05 940导读:本文是由陈皓和 ... -
学android开发 不得不去的好地方
2011-07-06 17:08 821中国移动开发者社区 h ... -
ppt制作
2011-04-04 18:50 850PowerPoint的动画效果比较多,但图片只能一幅一幅地动作 ... -
Java 虚拟机体系结构
2011-02-22 10:11 741众所周知,Java源代码被编译器编译成class文件。而并 ... -
提高程序运行效率的方法
2011-02-22 09:36 782浏览器发送一次请求 ... -
从JVM内存管理的角度谈谈静态方法和静态属性
2011-02-22 09:27 634作者 robbin (htt ... -
模型驱动软件开发实战步骤
2011-01-14 15:31 715有人说:今年是AJ ... -
实战DDD(Domain-Driven Design领域驱动设计)
2011-01-14 15:30 8052004年著名建模专家 ... -
领域模型驱动设计(DDD)之模型提炼
2011-01-14 15:30 775当Java世界提供的可 ... -
模型驱动设计(MDD)之灵活设计
2011-01-14 15:29 610灵活设计可以使我 ... -
JAVA开发者应该去的20个英文网站
2011-01-14 10:35 567http://www.javaalmanac. ... -
对代理模式与Java动态代理类的理解(三转)
2010-12-30 10:56 795文章分类:Java编程 1. 代理模式 代理模式的作 ... -
Java httpclient解决方案中的中文传递
2010-12-27 09:39 21191 Commons HttpClient 开源项目简介 Htt ... -
java字符串的各种编码转换
2010-12-26 19:57 804import java.io.UnsupportedEncod ... -
firebug的使用
2010-12-26 11:13 729什么是Firebug 从事了数 ... -
HttpClient 学习整理
2010-12-13 09:32 718HTTP 协议可能是现在 Internet 上使用得最多、 ... -
JAVA使用java.net.url模拟登录
2010-12-08 13:32 1446有的时候,会需要使用java的程序访问网页,正常的访问网页的程 ... -
面试知识点
2010-12-06 10:54 1043总结了一些要弄懂的知识点:JVM的构造框架,TCP的三次握手, ...
相关推荐
哈希表算法实现的C语言源程序 数据结构课程设计用
试着上传写了一段哈希表的C++代码。新手报到。谢谢大家。
数据结构哈希表的实现,很值得初学者的学习与应用,看完代买能够掌握基本哈希表的应用
(1) 采取除留余数法构造哈希表; (2) 采用线性探测再散列方法解决冲突,输出哈希表结果; (3) 采用链地址法处理冲突,输出哈希表结果; (4) 考查两种冲突方法的平均查找长度。
哈希表操作算法
算法面试通关40讲完整课件 14-17 哈希表(HashTable) 算法面试通关40讲完整课件 14-17 哈希表(HashTable) 算法面试通关40讲完整课件 14-17 哈希表(HashTable) 算法面试通关40讲完整课件 14-17 哈希表...
哈希表算法PPT,这几天算法课看的,在网上找的一个写的很不错的
哈希表及其查找算法.doc
哈希表 用链地址法解决冲突:(哈希函数是按名字第一个大写字母分的) 输入内容:学生的姓名跟成绩 操作:插入、修改、查找、删除学生;以及输出哈希表
主要介绍了哈希(Hash)算法的相关资料,帮助大家更好的利用python处理密码,感兴趣的朋友可以了解下
输入:待哈希数据序列 功能要求:输出哈希方法和解决冲突的方法(文字输出),输出哈希表
哈希表的建立和查找哈希表的建立和查找哈希表的建立和查找哈希表的建立和查找
假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用线性探测再散列法或链地址法处理冲突。
合工大数据结构C++实验报告拉链法哈希表查找算法
哈希表采用何种算法计算出hash 值?
哈希表算法实现 建哈希表 mid函数先把参数平方,然后取中间的第4、5位作为地址返回
哈希表设计程序设计+数据结构实验报告 1.1 针对某个集体中的人名设计一个哈希表,使得平均查找长度不超过R,完成相应的建立和查表程序. 1.2 人名为汉语拼音形式,最长不超过18个字符(如:庄双双 zhuangshuangshuang)...
哈希算法的高速FPGA实现,本文hi介绍,有少量算法介绍,共16页
/为班级30个人的姓名设计一个哈希表,假设姓名用汉语拼音表示。要求用除留余数法 构造哈希函数,用线性探测再散列法处理冲突,平均查找长度的上限为2。 编写数据结构和算法来实现。要求:将哈希函数和处理冲突方法...
通过对哈希算法的演示,很快能理解哈希表的功能和作用