Java常用HASH算法总结【经典实例】
程序员文章站
2024-03-31 17:32:22
本文实例讲述了java常用hash算法。分享给大家供大家参考,具体如下:
/**
* hash算法大全
* 推荐使用fnv1算法 * @...
* 推荐使用fnv1算法 * @...
本文实例讲述了java常用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) // hash = (hash >> 8) ^ tab[(hash & 0xff) ^ key[i]]; // return (hash & mask); // } /**//** * universal hashing */ public static int universal(char[]key, int mask, int[] tab) { int hash = key.length, i, len = key.length; for (i=0; i<(len<<3); i+=8) { char k = key[i>>3]; if ((k&0x01) == 0) hash ^= tab[i+0]; if ((k&0x02) == 0) hash ^= tab[i+1]; if ((k&0x04) == 0) hash ^= tab[i+2]; if ((k&0x08) == 0) hash ^= tab[i+3]; if ((k&0x10) == 0) hash ^= tab[i+4]; if ((k&0x20) == 0) hash ^= tab[i+5]; if ((k&0x40) == 0) hash ^= tab[i+6]; if ((k&0x80) == 0) hash ^= tab[i+7]; } return (hash & mask); } /**//** * zobrist hashing */ public static int zobrist( char[] key,int mask, int[][] tab) { int hash, i; for (hash=key.length, i=0; i<key.length; ++i) hash ^= tab[i][key[i]]; return (hash & mask); } // lookup3 // 见bob jenkins(3).c文件 // 32位fnv算法 static int m_shift = 0; /**//** * 32位的fnv算法 * @param data 数组 * @return int值 */ public static int fnvhash(byte[] data) { int hash = (int)2166136261l; for(byte b : data) hash = (hash * 16777619) ^ b; if (m_shift == 0) return hash; return (hash ^ (hash >> m_shift)) & m_mask; } /**//** * 改进的32位fnv算法1 * @param data 数组 * @return int值 */ public static int fnvhash1(byte[] data) { final int p = 16777619; int hash = (int)2166136261l; for(byte b:data) hash = (hash ^ b) * p; hash += hash << 13; hash ^= hash >> 7; hash += hash << 3; hash ^= hash >> 17; hash += hash << 5; return hash; } /**//** * 改进的32位fnv算法1 * @param data 字符串 * @return int值 */ public static int fnvhash1(string data) { final int p = 16777619; int hash = (int)2166136261l; for(int i=0;i<data.length();i++) hash = (hash ^ data.charat(i)) * p; hash += hash << 13; hash ^= hash >> 7; hash += hash << 3; hash ^= hash >> 17; hash += hash << 5; return hash; } /**//** * thomas wang的算法,整数hash */ public static int inthash(int key) { key += ~(key << 15); key ^= (key >>> 10); key += (key << 3); key ^= (key >>> 6); key += ~(key << 11); key ^= (key >>> 16); return key; } /**//** * rs算法hash * @param str 字符串 */ public static int rshash(string str) { int b = 378551; int a = 63689; int hash = 0; for(int i = 0; i < str.length(); i++) { hash = hash * a + str.charat(i); a = a * b; } return (hash & 0x7fffffff); } /**//* end of rs hash function */ /**//** * js算法 */ public static int jshash(string str) { int hash = 1315423911; for(int i = 0; i < str.length(); i++) { hash ^= ((hash << 5) + str.charat(i) + (hash >> 2)); } return (hash & 0x7fffffff); } /**//* end of js hash function */ /**//** * pjw算法 */ public static int pjwhash(string str) { int bitsinunsignedint = 32; int threequarters = (bitsinunsignedint * 3) / 4; int oneeighth = bitsinunsignedint / 8; int highbits = 0xffffffff << (bitsinunsignedint - oneeighth); int hash = 0; int test = 0; for(int i = 0; i < str.length();i++) { hash = (hash << oneeighth) + str.charat(i); if((test = hash & highbits) != 0) { hash = (( hash ^ (test >> threequarters)) & (~highbits)); } } return (hash & 0x7fffffff); } /**//* end of p. j. weinberger hash function */ /**//** * elf算法 */ public static int elfhash(string str) { int hash = 0; int x = 0; for(int i = 0; i < str.length(); i++) { hash = (hash << 4) + str.charat(i); if((x = (int)(hash & 0xf0000000l)) != 0) { hash ^= (x >> 24); hash &= ~x; } } return (hash & 0x7fffffff); } /**//* end of elf hash function */ /**//** * bkdr算法 */ public static int bkdrhash(string str) { int seed = 131; // 31 131 1313 13131 131313 etc.. int hash = 0; for(int i = 0; i < str.length(); i++) { hash = (hash * seed) + str.charat(i); } return (hash & 0x7fffffff); } /**//* end of bkdr hash function */ /**//** * sdbm算法 */ public static int sdbmhash(string str) { int hash = 0; for(int i = 0; i < str.length(); i++) { hash = str.charat(i) + (hash << 6) + (hash << 16) - hash; } return (hash & 0x7fffffff); } /**//* end of sdbm hash function */ /**//** * djb算法 */ public static int djbhash(string str) { int hash = 5381; for(int i = 0; i < str.length(); i++) { hash = ((hash << 5) + hash) + str.charat(i); } return (hash & 0x7fffffff); } /**//* end of djb hash function */ /**//** * dek算法 */ public static int dekhash(string str) { int hash = str.length(); for(int i = 0; i < str.length(); i++) { hash = ((hash << 5) ^ (hash >> 27)) ^ str.charat(i); } return (hash & 0x7fffffff); } /**//* end of dek hash function */ /**//** * ap算法 */ public static int aphash(string str) { int hash = 0; for(int i = 0; i < str.length(); i++) { hash ^= ((i & 1) == 0) ? ( (hash << 7) ^ str.charat(i) ^ (hash >> 3)) : (~((hash << 11) ^ str.charat(i) ^ (hash >> 5))); } // return (hash & 0x7fffffff); return hash; } /**//* end of ap hash function */ /**//** * java自己带的算法 */ public static int java(string str) { int h = 0; int off = 0; int len = str.length(); for (int i = 0; i < len; i++) { h = 31 * h + str.charat(off++); } return h; } /**//** * 混合hash算法,输出64位的值 */ public static long mixhash(string str) { long hash = str.hashcode(); hash <<= 32; hash |= fnvhash1(str); return hash; } }
更多关于java算法相关内容感兴趣的读者可查看本站专题:《java数据结构与算法教程》、《java字符与字符串操作技巧总结》、《java操作dom节点技巧总结》、《java文件与目录操作技巧汇总》和《java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
下一篇: 深度剖析java中JDK动态代理机制