算法学习之散列算法

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

       散列是以常数平均时间执行插入、删除、查找的技术。插入、删除、查找快;反之,不支持线性排序。Java数据结构API有HashMap、HashTable等使用了散列算法技术。

加密散列函数:一个安全的加密散列函数,它的一个关键特征就是,它是单向的。这意味着,从数学和计算机学角度下去看讲,从输出来反推输入,这简直是不可能的。也就是说,给定一个散列,想要理解或查到提供应这个散列函数的输入数据,它应该是不可能的。技术术语下去讲,我们称它为逆原像阻力(pre-image resistance)。

散列算法的特点:

1、每次输入同样的数据,得到的结果都是一样。散列函数总是将同样的输入映射到相同的索引。

2、算法应将不同的输入数据,得到不同的结果。散列函数总是将不同的输入映射到不同的索引。

3、散列函数知道数组有多大,只返回有效的索引。使用散列函数和数组创建hashtable数据结构。

散列函数适用于模拟映射关系快速查找,防止重复,缓存/记住数据,以免服务器处理来生成他们。散列表中解决hash冲突的情况采用了拉链法,把相同的hash值的不同的输入放到一个链表里面进行存储。为了避免链表过长造成的速度影响,散列表需要较低的填装因子,良好的散列函数。

hashmap采用的times33算法,times33算法就是 nhash = nhash*33 + *key++;

 hash = (hash << 5) + hash + (int) str.charAt(i); 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章