电子说
Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,l8l开28O9发2756系统所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
HASH函数(计算机算法领域)
若结构中存在和关键字K相等的记录,则必定在f(K)的存储位置上。由此,不需比较便可直接取得所查记录。称这个对应关系f为散列函数(Hash function),按这个思想建立的表为散列表。
对不同的关键字可能得到同一散列地址,即key1≠key2,而f(key1)=f(key2),这种现象称碰撞。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数H(key)和处理冲突的方法将一组关键字映象到一个有限的连续的地址集(区间)上,并以关键字在地址集中的"象"作为记录在表中的存储位置,这种表便称为散列表,这一映象过程称为散列造表或散列,所得的存储位置称散列地址。
若对于关键字集合中的任一个关键字,经散列函数映象到地址集合中任何一个地址的概率是相等的,则称此类散列函数为均匀散列函数(Uniform Hash function),这就是使关键字经过散列函数得到一个"随机的地址",从而减少冲突。
常用HASH函数
·直接取余法:f(x):=x mod maxM;maxM一般是不太接近2^t的一个质数。
·乘法取整法:f(x):=trunc((x/maxX)*maxlongit)mod maxM,主要用于实数。
·平方取中法:f(x):=(x*x div 1000)mod 1000000);平方后取中间的,每位包含信息比较多。
public class Main{
public static void main(String[]args)throws Exception{
//创建一个MessageDigest实例:
MessageDigest md=MessageDigest.getInstance("SHA-1");
//反复调用update输入数据:
md.update("Hello".getBytes("UTF-8"));
md.update("World".getBytes("UTF-8"));
byte[]result=md.digest();//20 bytes:db8ac1c259eb89d4a131b253bacfca5f319d54f2
System.out.println(new BigInteger(1,result).toString(16));
审核编辑:符乾江
全部0条评论
快来发表一下你的评论吧 !