什么是哈希 / 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 计算后后果雷同,则阐明该文件内容极大概率就是一样的。