算法系列(十二)散列

概述

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
HASH主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。

散列表是一种用于以常数平均时间执行插入、删除、查找的算法。

散列函数

散列表每个关键字被映射到0到TableSize-1这个范围中的某个值,这个映射叫做散列函数。因为单元个数是有限的,两个关键字可能映射到同一个值,这个时候就需要通过一些方式来处理冲突。

以关键字为字符串为例,设计简单的散列函数。

通过将字符串的ASCII码值的和来计算hash值。

public static int hash1(String key, int tablesize) {
		int hashVal = 0;
		for (int i = 0; i < key.length(); i++) {
			hashVal += key.charAt(i);
		}
		return hashVal % tablesize;
	}

这种方法有个明显缺陷,就是hash值分配不均匀。

较好的散列方法

public static int hash2
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
算法是一种将任意长度的输入转换为固定长度输出的算法。它的基本原理是通过对输入数据进行一系的处理和变换,最终生成一个唯一的值。这个值是根据输入数据计算得出的,并且具有以下几个特点: 1. 唯一性:对于不同的输入数据,算法应该生成不同的值。 2. 固定长度:无论输入数据的长度是多少,算法都会生成固定长度的输出。 3. 不可逆性:根据值无法推导出原始输入数据的内容。 4. 值的变化:即使输入数据的细微变化,也会导致生成的值完全不同。 实现算法的方法有很多种,其中常见的一种是MD5(Message Digest Algorithm 5)算法。MD5算法是MD家族中最常用的一种加密算法。它基于一系的位操作、位移操作和逻辑运算,对输入数据进行分组处理,并通过多次迭代和轮函数的运算来生成最终的值。 MD5算法的实现过程可以分为以下几个步骤: 1. 填充信息:将输入数据进行填充,使得数据长度满足算法要求。 2. 初始值设置:设置初始的值,即A、B、C、D。 3. 真正的计算:通过多次迭代和轮函数的运算,对输入数据进行处理,最终生成值。 算法的实现还可以通过其他算法,如SHA-1、SHA-256等。在实际应用中,算法常用于校验文件的完整性和存储用户密码等场景。通过对文件进行计算,可以判断文件是否被篡改;而存储用户密码时,通常将密码进行处理,并将值存储在数据库中,以增加密码的安全性。 在Java中,可以使用java.security.MessageDigest类来实现并使用算法。使用该类可以对输入数据进行计算,并生成值。具体的实现和使用方法可以参考Java文档和相关教程。 综上所述,算法的基本原理是将任意长度的输入转换为固定长度的输出,通过一系的处理和变换来生成唯一的值。常见的实现方法包括MD5算法和SHA系算法。使用Java的MessageDigest类可以方便地实现和使用算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值