多种哈希算法代码,用于文件校验、简单加密等场合。
哈希表也称作散列表,叫法不同,是一个意思。这种数据结构提供了键值对的映射关系,给出键就可以快速得到对应的值,比如上面提到的"50号"就是键,游戏机就是键得到的值。时间复杂度接近O(1)。哈希表是如何根据键来得到值的呢?我们来揭秘这个过程。

内容介绍,详细项目开发可咨询小编
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *Copyright 2008-2015, www.xxx.comFile name : HashFunction.hAuthor : Version : V00R001Date : Description : Hash函数集合,包含主流的hash函数Struct List : Function list:History :1. Date : 2008-10-25Create : Modification : create* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */#include "HashFunction.h"#define ngx_hash(key, c) ((u_int) key * 31 + c)unsigned int ngx_hash_key(const std::string& data){ size_t len = data.size(); unsigned int i, key; key = 0; for (i = 0; i < len; i++) { key = ngx_hash(key, data); } return key;}//经典字符串Hash函数unsigned int pub_inthash(const char *str) { register unsigned int h; register unsigned char *p; for(h=0, p = (unsigned char *)str; *p ; p++) h = 31 * h + *p; return h; } //PHP中出现的字符串Hash函数unsigned long php_longhashpjw(const char* str) { unsigned long h = 0, g; char *p; for(h=0, p = (char *)str; *p ; p++) { h = (h << 4) + *p++; if ((g = (h & 0xF0000000))) { h = h ^ (g >> 24); h = h ^ g; } } return h; } //OpenSSL中出现的字符串Hash函数unsigned int OpenSSL_strhash1(const char *str) { int i,l; unsigned int ret=0; unsigned short *s; if (str == NULL) return(0); l=(strlen(str)+1)/2; s=(unsigned short *)str; for (i=0; i <l;++i) ret^=(s<<(i&0x0f)); return(ret); } //MySql中出现的字符串Hash函数unsigned int mysql_hashnr1(const char *key,unsigned int length) { register unsigned int nr=1, nr2=4; while (length--) { nr^= (((nr & 63)+nr2)*((unsigned int) (unsigned char) *key++))+ (nr << 8); nr2+=3; } return((unsigned int) nr); } unsigned int mysql_hashnr_caseup1(const char *key,unsigned int length) { register unsigned int nr=1, nr2=4; while (length--) { nr^= (((nr & 63)+nr2)*((unsigned int) (unsigned char) toupper(*key++)))+ (nr << 8); nr2+=3; } return((unsigned int) nr); } unsigned int mysql_hashnr2(const char *key, unsigned int len) { const char *end=key+len; unsigned int hash; for (hash= 0; key < end; key++) { hash*= 16777619; hash^= (unsigned int) *(unsigned char*) key; } return (hash); } unsigned int mysql_hashnr_caseup2(const char *key, unsigned int len) { const char *end=key+len; unsigned int hash; for (hash= 0; key < end; key++) { hash*= 16777619; hash^= (unsigned int) (unsigned char) toupper(*key); } return (hash); } /*** 加法hash* @param key 字符串* @param prime 一个质数* @return hash结果*/int additiveHash(const std::string& key, int prime){ unsigned int hash, i; for (hash = key.size(), i = 0; i < key.size(); i++) hash += key; return (hash % prime);}/*** 旋转hash* @param key 输入字符串* @param prime 质数* @return hash值*/ int rotatingHash(const std::string& key, int prime){ unsigned int hash, i; for (hash=key.size(), i=0; i<key.size(); ++i) hash = (hash<<4)^(hash>>28)^key; return (hash % prime);// return (hash ^ (hash>>10) ^ (hash>>20));}/*** 一次一个hash* @param key 输入字符串* @return 输出hash值*/ int oneByOneHash(const std::string& key){ unsigned int hash, i; for (hash=0, i=0; i<key.size(); ++i) { hash += key; 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*/ int bernstein(const std::string& key){ unsigned int hash = 0; unsigned int i; for (i=0; i<key.size(); ++i) hash = 33*hash + key; return hash;}/** * RS算法hash * @param str 字符串 */unsigned int RSHash(const std::string& str){ unsigned int b = 378551; unsigned int a = 63689; unsigned int hash = 0; for(unsigned int i = 0; i < str.size(); i++) { hash = hash * a + str; a = a * b; } return (hash & 0x7FFFFFFF);}/** * JS算法 */ int JSHash(const std::string& str){ int hash = 1315423911; for(unsigned int i = 0; i < str.size(); i++) { hash ^= ((hash << 5) + str + (hash >> 2)); } return (hash & 0x7FFFFFFF);}/** * PJW算法 */ int PJWHash(const std::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(unsigned int i = 0; i < str.size();i++) { hash = (hash << OneEighth) + str; if((test = hash & HighBits) != 0) { hash = (( hash ^ (test >> ThreeQuarters)) & (~HighBits)); } } return (hash & 0x7FFFFFFF);}/* End Of P. J. Weinberger Hash Function *//** * ELF算法 */ int ELFHash(const std::string& str){ int hash = 0; int x = 0; for(unsigned int i = 0; i < str.size(); i++) { hash = (hash << 4) + str; if((x = (int)(hash & 0xF0000000L)) != 0) { hash ^= (x >> 24); hash &= ~x; } } return (hash & 0x7FFFFFFF);}/* End Of ELF Hash Function *//** * BKDR算法 */uint32_t BKDRHash32(const std::string& str){ uint32_t seed = 131; // 31 131 1313 13131 131313 etc.. uint32_t hash = 0; for(unsigned int i = 0; i < str.size(); ++i) { hash = (hash * seed) + str; } return (uint32_t)hash;}uint64_t BKDRHash64(const std::string& str){ uint64_t seed = 131; // 31 131 1313 13131 131313 etc.. uint64_t hash = 0; for(unsigned int i = 0; i < str.size(); ++i) { hash = (hash * seed) + str; } return (uint64_t)hash;}/* End Of BKDR Hash Function *//** * SDBM算法 */ int SDBMHash(const std::string& str){ int hash = 0; for(unsigned int i = 0; i < str.size(); i++) { hash = str + (hash << 6) + (hash << 16) - hash; } return (hash & 0x7FFFFFFF);}/* End Of SDBM Hash Function *//** * DJB算法 */unsigned int DJBHash(const std::string& str){ unsigned int hash = 5381; for(unsigned int i = 0; i < str.size(); i++) { hash = ((hash << 5) + hash) + str; } return (hash & 0x7FFFFFFF);}/* End Of DJB Hash Function *//** * DEK算法 */ int DEKHash(const std::string& str){ int hash = str.size(); for(unsigned int i = 0; i < str.size(); i++) { hash = ((hash << 5) ^ (hash >> 27)) ^ str; } return (hash & 0x7FFFFFFF);}/* End Of DEK Hash Function *//** * AP算法 */ int APHash(const std::string& str){ int hash = 0; for(unsigned int i = 0; i < str.size(); i++) { hash ^= ((i & 1) == 0) ? ( (hash << 7) ^ str ^ (hash >> 3)) : (~((hash << 11) ^ str ^ (hash >> 5))); }// return (hash & 0x7FFFFFFF); return hash;}/* End Of AP Hash Function *//** * JAVA自己带的算法 */ int java(const std::string& str){ int h = 0; int off = 0; unsigned int len = str.size(); for (unsigned int i = 0; i < len; i++) { h = 31 * h + str[off++]; } return h;}