`
GLC
  • 浏览: 112759 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

hash函数

阅读更多

对于hash函数、一般来讲它属于数据结构知识里的一个需要重要掌握的方面;而这些数据结构和算法分析对我们搞IT的同学来说、它的重要性就不言而喻了。有这么一个简单的比方:学习java工资是5000,学习C++工资是6000;如果你搞好了算法分析和数据结构;那么你的工资就是1万了;所以很感谢公司对我们花费大量的时间来对待它。。。在这里,我想对hu总说声对不起、平常上课总是没听他讲课,总想着做自己的;这种在课堂上自顾自己不顾他人感受的做法是一种很坏的习惯。那种换位思考自己会不会感到难过的事就不说了。我还是先说说hash函数吧。


Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。


Hash的主要用途是在两个方面:信息安全领域的加密算法、另一个则是在数据存储的地址上。今天、在这里着重介绍数据存储方面;我们应该知道通过hash可以把大量数据需要大空间存储变成小空间存储、从而节省存储空间。这种算法对于过去少而贵的磁盘空间来说异常重要。怎么通过hash达到这种效果呢?首先我们建立一个数组;对于这个数组来说,我们查找数据就很方便;

         public Object[] array = new Object[15];
	int value = 13;// 定义一个除数取余法的除数
	double number=0.75;//加载因子
	int d;



但是这个数组因为空间有限、我们仅仅

用它来存储数据就达不到想要的结果;怎么办呢?数组的长度是不能增加的、但我们知道链表的长度是可以随意增加删减的。所以、在建立数组后,我们可以在每个数组对应的下标下放入链表。

/**
 * 用来存储在数组中 
 * @author Administrator
 *
 */
public class Type {
 
	public  Node node;//添加结点
	public int  length;//记录数组当前位置上链表的长度
	public Node cur;//记录链表的当前结点
}

package hash;

/**
 * 链表结点
 * 
 * @author Administrator
 * 
 */
public class Node {

	// 节点类的数据对象
	private Object obj;
	private Node next;//指向下一结点
	private Node pre;//指向上一结点
	public int length=0;
	static Node top;

	public Node getPre() {
		return pre;
	}

	public void setPre(Node pre) {
		this.pre = pre;
		length++;
	}
	
	public Node getNext() {
		return next;
	}

	public void setNext(Node next) {
		this.next = next;
		length++;
	}

	// 返回节点
	public Object getObj() {
		return obj;
	}

	// 设置节点
	public void setObj(Object obj) {
		this.obj = obj;
	}
	public int getLength(){
		return length;
	}
}
//主函数中添加数据
//增加数据
	public void addData() {
//		while (!(d==13)) {
			Scanner stdin = new Scanner(System.in);
			System.out.println("Please input a int");
			d = stdin.nextInt();
			System.out.println("刚输入的数据是:" + d);
			// 每增加一个数,将其存储到hash表中
			int mod = d % value;
			
			System.out.println("得到的余数是:"+mod);
			if (array[mod] == null) {// 判断是否为空
				Node node = new Node();
				node.setNext(null);//设置前一结点为空
				node.setObj(d);//设置数据域
				node.length++;
				
				Type type=new Type();//用来存储在数组中的数据:包括链表长度、
				type.node=node;
				type.length=1;
				type.cur=node;//将下一指针指向当前结点
				array[mod] = type;//存储到数组中
			} else {
				//判断是否存在此数据
				if(find(d)){
					return;//有则返回
				}
				// 如果当前位置有数据,则向下移动;建立链表结构
				Node node = new Node();
				node.setObj(d);//设置数据域
				node.setNext(((Type)array[mod]).cur);//设置上结点
				((Type)array[mod]).length++;//此数组下的链表长度加1
				((Type)array[mod]).cur=node;// 定义一个结点、用来标识当前结点;
			}
//		}

	}


这样、对于每个数据我们先对它进行除数取余法;如果数组中对应取余的下标位置中没有数据则将此数据放入;如果当前下标中存有数据则添加到链表中、就这样我们可以将多个数据添加存储起来。不过、这里还有一个问题,如果当前数组下标位置中的数据足够多、那我们是无限地添加下去吗?答案是否定的、我们不能那样无限次的添加下去;否则就与链表没啥区别了。所以这里我们还要介绍另一个名词:加载因子;它是由链表的长度比上数组的长度所得的值;这个值可以自己自由设定;如果你将它设定在0-1之间、那么它最体现的效果就是节省空间;如果是大于1、那么它最体现的效果就是节省时间了。。。当数组中此下标位置上的链表数据大于数组的长度与加载因子的乘积时,我们解决的办法就是再hash。rehash就是将链表溢满的数据放到其他下标的链表上。其代码实现还有点问题、暂时我就不放上来了。。如有不足、请原谅
分享到:
评论

相关推荐

    密码学hash函数关于hash函数的ppt

    - **消息认证码(MAC)**是使用带密钥的Hash函数实现的,它结合了Hash函数的安全特性和密钥的安全性,以确保只有合法接收方才能验证消息的完整性。 2. **数字签名** - 在数字签名过程中,首先使用密码学Hash函数...

    Hash函数研究综述

    ### Hash函数研究综述 #### 引言 Hash函数作为一种重要的密码学组件,在现代信息安全领域扮演着关键角色。它可以用于数字签名方案、验证信息来源的真实性和完整性等方面,并且能够将任意长度的消息压缩到固定长度...

    信息安全原理与技术-第五章Hash函数和数字签名.ppt

    Hash函数和数字签名 Hash函数和数字签名 Hash函数和数字签名

    混沌加密算法与HASH函数构造研究_12767438.zip

    例如,混沌可以用于生成动态的、不可预测的密钥,这些密钥可以作为输入到HASH函数中,生成唯一的哈希值,用于加密或认证。这种方式提高了密码的安全性,因为即使攻击者知道混沌系统的一些参数,他们仍然需要解决混沌...

    HASH函数实验指导

    **正文** 在信息技术领域,哈希(Hash)函数与数字签名是两个至关重要的概念,它们在...在实验四的“Hash函数”文档中,会详细阐述这些理论知识,并可能包含具体的操作步骤和示例,以帮助学生加深理解并实践这些概念。

    Hash函数与消息认证

    hash函数与消息认证讲义 包括 5.1 Hash函数概述 5.1.1 Hash函数定义 5.1.2 Hash函数的安全性 5.1.3 Hash函数的迭代构造法 5.2 Hash函数MD5 5.2.1 MD5算法 5.2.2 MD5的安全性 5.3 安全Hash算法SHA-1 5.3.1 SHA-1...

    hash函数的设计优化

    在李羽修的《Hash函数的设计优化》文档中,可能详细讨论了这些优化策略,并提供了实际案例和分析,帮助读者理解如何在实践中优化哈希函数,以满足特定需求和挑战。对于IT专业人士来说,理解和掌握哈希函数的设计优化...

    各种Hash函数(JAVA版)

    RS-Hash Function Value: " + ghl.RSHash(key)); System.out.println(" 2. JS-Hash Function Value: " + ghl.JSHash(key)); System.out.println(" 3. PJW-Hash Function Value: " + ghl.PJWHash(key)); System....

    hash函数 实例

    根据给定的文件信息,我们可以总结出以下关于 Hash 函数在 C 语言中的实现与应用的知识点: ### 1. Hash 函数的概念 哈希函数(Hash Function)是一种将任意长度的消息映射到固定长度的消息摘要的一种算法。这种...

    HASH函数及其应用_朱全民.ppt

    在"HASH函数及其应用_朱全民.ppt"中,主要讨论了哈希函数的构造方法、冲突处理以及实际应用。 一、哈希函数构造方法 1. 直接取余法:这是最简单的哈希函数构造方式,通过将关键字k除以表长m取余数来确定哈希值。...

    Hash函数的设计优化

    本文主要介绍Hash函数的设计优化,包括数字、字符串、排列等,并给出相关的代码。

    hash函数的完全解析

    Hash函数是一种将任意长度的输入通过散列算法转换成固定长度输出的函数,这种输出又被称为散列值或者哈希值。一个设计良好的Hash函数能够快速处理输入数据并尽量减少不同输入得到相同输出的情况,即碰撞。在信息存储...

    所有有关HASH函数的论文

    所有有关HASH函数的论文,hash,安全散列算法,值得参考有几十篇关于密码学的论文

    第八讲 HASH函数1

    HASH函数 HASH 函数是密码学中的一种基本概念,用于将任意长的数据变换为定长的码。HASH 函数的定义是将输入消息 M 变换为固定大小的 Hash 码 h,记为 h = H(M) 或 h = HH(M)。HASH 函数的输出 h 称为消息摘要、...

    论文研究-基于改进混沌Hash函数的一次签名方案.pdf

    分析了一种基于混沌构造的Hash函数方法,发现其中存在着碰撞。提出了一种基于改进Hash函数的一次数字签名方案,并对此方案的统计性和安全性进行了分析。

Global site tag (gtag.js) - Google Analytics