Hash算法大全.txt
### Hash算法大全 #### 一、引言 Hash算法是一种将任意长度的数据转换为固定长度输出的方法,这种输出通常称为Hash值或Hash码。在计算机科学领域,Hash算法被广泛应用于数据查找、密码存储以及数据完整性校验等多个场景。本文档主要介绍了多种常见的Hash算法,并重点推荐了FNV1(Fowler–Noll–Vo)算法。 #### 二、Hash算法概述 Hash算法具有以下特点: - 输入可以是任意长度。 - 输出总是固定长度。 - 对于不同的输入,输出应当尽可能不同。 - 计算速度快且计算结果可预测。 - 单向性,即无法通过Hash值反推出原始数据。 #### 三、Hash算法实例 1. **加法Hash算法 (Additive Hash)** - **定义**:这是一种简单的Hash算法,通过累加字符串中的字符ASCII值来计算Hash值。 - **实现**: ```java public static int additiveHash(String key, int prime) { int hash = 0; for (int i = 0; i < key.length(); i++) { hash += key.charAt(i); } return (hash % prime); } ``` - **应用**:适用于小型数据库或者简单哈希表应用。 2. **旋转Hash算法 (Rotating Hash)** - **定义**:通过位移操作来混合字符串中的字符ASCII值,以增加Hash值的随机性。 - **实现**: ```java public static int rotatingHash(String key, int prime) { int hash = 0; for (int i = 0; i < key.length(); i++) { hash = (hash << 4) ^ (hash >> 28) ^ key.charAt(i); } return (hash % prime); } ``` - **应用**:适合对安全性有一定要求的场景。 3. **逐位Hash算法 (One by One Hash)** - **定义**:通过对每个字符进行复杂运算,提高Hash值的分布均匀性。 - **实现**: ```java public static int oneByOneHash(String key) { int hash = 0; for (int i = 0; i < key.length(); i++) { hash += key.charAt(i); hash += (hash << 10); hash ^= (hash >> 6); } hash += (hash << 3); hash ^= (hash >> 11); hash += (hash << 15); return hash; } ``` - **应用**:适用于需要更高散列质量的场景。 4. **伯恩斯坦Hash算法 (Bernstein's Hash)** - **定义**:由Daniel J. Bernstein提出的一种快速Hash算法,采用简单的乘法和加法操作。 - **实现**: ```java public static int bernstein(String key) { int hash = 0; for (int i = 0; i < key.length(); i++) { hash = 33 * hash + key.charAt(i); } return hash; } ``` - **应用**:因其计算效率高,适用于各种应用场景。 5. **FNV1算法 (Fowler–Noll–Vo)** - **定义**:一种非加密的Hash函数,以其计算速度快和散列质量好而著称。 - **实现**:未给出具体代码,但一般形式如下: ```java public static long fnv1(String str) { final int p = 16777619; int hash = (int) 2166136261L; for (int i = 0; i < str.length(); i++) { hash = (hash ^ str.charAt(i)) * p; } hash += hash << 13; hash ^= hash >> 7; hash += hash << 3; hash ^= hash >> 17; hash += hash << 5; return hash; } ``` - **应用**:广泛应用于网络协议、文件系统、分布式系统等领域。 #### 四、总结 本文档介绍了几种常见的Hash算法及其应用场景。其中特别推荐了FNV1算法,该算法不仅计算效率高,而且具有良好的散列质量,非常适合在网络通信等场景中使用。对于不同的应用场景,可以根据实际需求选择合适的Hash算法,以满足性能和安全性的双重需求。
* Hash算法大全<br>
* 推荐使用FNV1算法
* @algorithm None
* @author Goodzzp 2006-11-20
* @lastEdit Goodzzp 2006-11-20
* @editDetail Create
*/
public class HashAlgorithms
{
/**//**
* 加法hash
* @param key 字符串
* @param prime 一个质数
* @return hash结果
*/
public static int additiveHash(String key, int prime)
{
int hash, i;
for (hash = key.length(), i = 0; i < key.length(); i++)
hash += key.charAt(i);
return (hash % prime);
}
/**//**
* 旋转hash
* @param key 输入字符串
* @param prime 质数
* @return hash值
*/
{
int hash, i;
for (hash=key.length(), i=0; i<key.length(); ++i)
hash = (hash<<4)^(hash>>28)^key.charAt(i);
return (hash % prime);
// return (hash ^ (hash>>10) ^ (hash>>20));
}
// 替代:
// 使用:hash = (hash ^ (hash>>10) ^ (hash>>20)) & mask;
// 替代:hash %= prime;
/**//**
* MASK值,随便找一个值,最好是质数
*/
static int M_MASK = 0x8765fed1;
/**//**
* 一次一个hash
* @param key 输入字符串
* @return 输出hash值
*/
public static int oneByOneHash(String key)
{
int hash, i;
for (hash=0, i=0; i<key.length(); ++i)
{
hash += key.charAt(i);
hash += (hash << 10);
hash ^= (hash >> 6);
剩余13页未读,继续阅读
- xuanmu20112011-10-22只是实现中的很小的一部分,过于简单了。
- 粉丝: 10
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助