哈希又称作“散列”,是一种数学计算机程序,它接收任何一组任意长度的输入信息,通过哈希算法变换成固定长度的数据指纹输出形式,如字母和数字的组合,该输出就是“哈希值”。
总体而言,哈希算法可理解为一种消息摘要算法,将消息或数据压缩变小并拥有固定格式。由于其单向运算具有一定的不可逆性,哈希算法已成为加密算法中一个构成部分,但完整的加密机制不能仅依赖哈希算法。
在一个cache系统中,需要实现一个域名白名单,域名为下列数据:
、、sohu.com等
该白名单需要在程序启动时加载一次,主要执行查询操作。请设计一个数据结构和相应的初始化查询函数,使得检索尽可能的快。(不能使用stl::map,等等key-value刑类库)。
哈希是将任意长的输入编程加密的固定长度输出的过程。V询(Whi366)哈希并不等同于加密方法,因为无法解密哈希值来获取原始数据。事实上哈希是一种单向加密函数。
With a hash function,data on the Internet can be saved as a fixed length string.One method is SHA-256(secure hash algorithm-256 bits).SHA-256 is the successor of SHA-1,and the output of SHA-1 is 160 bits.
这些函数使用位运算使得每一个字符都对最后的函数值产生影响。
代码语言:javascript复制 //ELF Hash Function
unsigned int ELFHash(char*str)
{
unsigned int hash=0;
unsigned int x=0;
while(*str)
{
hash=(hash<<4) (*str );//hash左移4位,当前字符ASCII存入hash低四位。
if((x=hash&0xF0000000L)!=0)
{//如果最高的四位不为0,则说明字符多余7个,如果不处理,再加第九个字符时,第一个字符会被移出,因此要有如下处理。
//该处理,如果对于字符串(a-z或者A-Z)就会仅仅影响5-8位,否则会影响5-31位,因为C语言使用的算数移位
hash^=(x>>24);
//清空28-31位。
hash&=~x;
}
}
//返回一个符号位为0的数,即丢弃最高位,以免函数外产生影响。(我们可以考虑,如果只有字符,符号位不可能为负)
return(hash&07FFFFFFF);
}
//该散列算法是基于贝尔实验室的彼得J温伯格的的研究。
//在Compilers一书中(原则,技术和工具),建议采用这个算法的散列函数的哈希方法。
unsigned int PJWHash(const char*str)
{
unsigned int BitsInUnignedInt=(unsigned int)(sizeof(unsigned int)*8);
unsigned int ThreeQuarters=(unsigned int)((BitsInUnignedInt*3)/4);
unsigned int6(unsigned int)(BitsInUnignedInt/8);
unsigned int HighBits=(unsigned int)(0xFFFFFFFF)<<(BitsInUnignedInt
-OneEighth);
unsigned int hash=0;
unsigned int test=0;
while(*str)