- 浏览: 286022 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 597作为程序员,要取得非凡成就需要记住的15件事。 1.走一条不 ... -
每天写出好代码的5个建议(转自CSDN)
2011-07-21 21:18 566成为一个优秀的程序员 ... -
程序员技术练级攻略(转自CSDN)
2011-07-21 21:05 1009导读:本文是由陈皓和 ... -
学android开发 不得不去的好地方
2011-07-06 17:08 854中国移动开发者社区 h ... -
ppt制作
2011-04-04 18:50 909PowerPoint的动画效果比较多,但图片只能一幅一幅地动作 ... -
Java 虚拟机体系结构
2011-02-22 10:11 798众所周知,Java源代码被编译器编译成class文件。而并 ... -
提高程序运行效率的方法
2011-02-22 09:36 821浏览器发送一次请求 ... -
从JVM内存管理的角度谈谈静态方法和静态属性
2011-02-22 09:27 672作者 robbin (htt ... -
模型驱动软件开发实战步骤
2011-01-14 15:31 757有人说:今年是AJ ... -
实战DDD(Domain-Driven Design领域驱动设计)
2011-01-14 15:30 8482004年著名建模专家 ... -
领域模型驱动设计(DDD)之模型提炼
2011-01-14 15:30 824当Java世界提供的可 ... -
模型驱动设计(MDD)之灵活设计
2011-01-14 15:29 649灵活设计可以使我 ... -
JAVA开发者应该去的20个英文网站
2011-01-14 10:35 618http://www.javaalmanac. ... -
对代理模式与Java动态代理类的理解(三转)
2010-12-30 10:56 842文章分类:Java编程 1. 代理模式 代理模式的作 ... -
Java httpclient解决方案中的中文传递
2010-12-27 09:39 21981 Commons HttpClient 开源项目简介 Htt ... -
java字符串的各种编码转换
2010-12-26 19:57 866import java.io.UnsupportedEncod ... -
firebug的使用
2010-12-26 11:13 785什么是Firebug 从事了数 ... -
HttpClient 学习整理
2010-12-13 09:32 758HTTP 协议可能是现在 Internet 上使用得最多、 ... -
JAVA使用java.net.url模拟登录
2010-12-08 13:32 1479有的时候,会需要使用java的程序访问网页,正常的访问网页的程 ... -
面试知识点
2010-12-06 10:54 1086总结了一些要弄懂的知识点:JVM的构造框架,TCP的三次握手, ...
相关推荐
Hash算法是一种将任意长度的输入(也叫做预映射)通过一个特定的函数转换成固定长度输出的算法。这个输出通常称为哈希值或散列值。哈希算法在计算机科学中有广泛的应用,如数据存储、查找表、密码学、数字签名等。...
`ELFHash`函数通过左移4位、与字符相加,然后对高4位进行异或和位移操作,以此来混合哈希值。这个算法在处理英文字符时效果较好,但对于其他语言可能表现一般。 5. **BKDR哈希(Bernstein哈希)** BKDR哈希是由D. ...
动态解析过程中,当遇到未解析的外部符号时,系统会使用elf_hash计算符号的哈希值,然后在动态链接器的哈希表中搜索匹配项。如果找到匹配,就会调用相应的函数或访问变量;如果没有找到,会继续使用其他方法(如...
4. RS算法hash、PJW算法、ELF算法、BKDR算法、SDBM算法、DJB算法、DEK算法、AP算法 这些算法是早期的哈希函数,它们各有特点,但通常不被现代哈希表实现所采用。例如,RS算法使用了移位和异或操作,而DJB算法...
在计算机科学中,哈希(Hash)函数是一种用于将任意长度的数据映射为固定长度输出的算法。这种输出通常称为哈希值,它在数据结构(如哈希表)、密码学、数字签名等领域有着广泛的应用。本文将对几种常见的字符串哈希...
9. **ELFHash**:一种简单的散列函数,用于将字符串映射到整数,常用于哈希表的键值计算。 10. **djb2、sdbm、lose lose**:这是几种不同的散列函数,它们各有特点,适用于不同场景,如字符串散列,快速查找等。 ...
例如,在哈希表中利用哈希函数快速定位数据的位置,提高检索效率。 2. **加密哈希**:用于数据和用户身份的验证。一个有效的加密哈希函数具备单向性,即很难从哈希结果反推原始数据。这种特性使得加密哈希常被用于...
此外,哈希函数的选择还应考虑应用场景的具体需求,比如是否需要高度不可预测的哈希值(用于加密或安全目的)、是否需要快速计算(如数据库索引)或是否对哈希冲突的容忍度较高(如分布式哈希表)。总之,理解每种...
`HashMap`内部使用哈希表来存储数据,其中最关键的部分就是哈希函数的设计。一个好的哈希函数能够将不同的键映射到不同的哈希值,从而提高`HashMap`的性能,减少冲突。本文将深入探讨`HashMap`中几种典型的哈希函数...
例如,一个基于ELF(Executable and Linkable Format)的散列函数被提及,这是Unix System V中使用的一种散列方法。该函数通过逐字节迭代字符串,将每个字符与当前哈希值进行位运算来计算散列值。 在查找元素时,...