什么是哈希/ Hash(wxID:StPv888)
哈希又称作“散列”,是一种数学计算机程序,它接管任何一组任意长度的输出信息,通过哈希算法变换成固定长度的数据指纹输入模式,如字母和数字的组合,该输入就是“哈希值”。

总体而言,哈希算法可了解为一种音讯摘要算法,将音讯或数据压缩变小并领有固定格局。因为其单向运算具备肯定的不可逆性,哈希算法已成为加密算法中一个形成局部,但残缺的加密机制不能仅依赖哈希算法。

在一个cache零碎中,须要实现一个域名白名单,域名为下列数据:
、、sohu.com 等
该白名单须要在程序启动时加载一次,次要执行查问操作。请设计一个数据结构和相应的初始化查问函数,使得检索尽可能的快。(不能应用stl::map,等等key-value刑类库)。
咱们能够看到,该题目提出了字符串的疾速查找,并且只加载一次。应用Hash比拟好。

咱们可能首先就是想到应用 C++ 中的 MAP ,题目中给出了不容许应用MAP,那么必定第二抉择就是应用Berkeley DB (DB)这种的文件数据库了,然而题目中显著提出不容许应用key-value类型库。

咱们思考Berkeley DB (DB)的原理能够知道,这个就是一个Hash的过程,map其实也是hash的思维。

本人设计一个hash零碎咯。抵触解决…

字符串hash可能就想到应用ELFhash算法,次要剖析下ELFHash算法。

ELFhash函数在UNIX零碎V 版本4中的“可执行链接格局”( Executable and Linking Format,即ELF )中会用到,ELF文件格式用于存储可执行文件与指标文件。ELFhash函数是对字符串的散列。它对于长字符串和短字符串都很无效,字符串中每个字符都有同样的作用,它奇妙地对字符的ASCII编码值进行计算,ELFhash函数对于可能比拟平均地把字符串散布在散列表中。
这些函数应用位运算使得每一个字符都对最初的函数值产生影响。

// 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 & 0×7FFFFFFF);

}

常见哈希算法

目前常见的 Hash 算法包含国内上的 Message Digest( MD) 系列和 Secure Hash Algorithm( SHA) 系列算法,以及国内的 SM3 算法。

其中,SHA 256 是 SHA 系列算法之一,由美国国安局设计、美国国家标准与技术研究院公布的一套哈希算法,因为其摘要长度为 256bits,故称 SHA 256。SHA 256也是爱护数字信息的最平安的办法之一。

例如计算

“hello blockchain world, this is yeasy@github”的SHA-256 Hash值,

失去的后果将是

“db8305d71a9f2f90a3e118a9b49a4c381d2b80cf7bcef81930f30ab1832a3c90”。

对于某个文件,无需查看原始内容,只有其 SHA-256 Hash 计算后后果雷同,则阐明该文件内容极大概率就是一样的。