当前位置: 代码迷 >> 高性能计算 >> Hash算法解决思路
  详细解决方案

Hash算法解决思路

热度:1427   发布时间:2013-02-26 00:00:00.0
Hash算法
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值
*/
public static int rotatingHash(String key, int prime)
{
   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);
   }
   hash += (hash << 3);
   hash ^= (hash >> 11);
   hash += (hash << 15);
//   return (hash & M_MASK);
   return hash;
}

/**
* Bernstein's hash
* @param key 输入字节数组
* @param level 初始hash常量
* @return 结果hash
*/
public static int bernstein(String key)
{
   int hash = 0;
   int i;
   for (i=0; i<key.length(); ++i) hash = 33*hash + key.charAt(i);
   return hash;
}

//
//// Pearson's Hash
// char pearson(char[]key, ub4 len, char tab[256])
// {
//   char hash;
//   ub4 i;
//   for (hash=len, i=0; i<len; ++i) 
//     hash=tab[hash^key[i]];
//   return (hash);
// }

//// CRC Hashing,计算crc,具体代码见其他
// ub4 crc(char *key, ub4 len, ub4 mask, ub4 tab[256])
// {
//   ub4 hash, i;
//   for (hash=len, i=0; i<len; ++i)