Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
哈希能够实现数据从一个维度向另一个维度的映射,通常使用哈希函数实现这种映射。通常业界使用y = hash(x)的方式进行表示,该哈希函数实现对x进行运算计算出一个哈希值y。
A、哈希算法的特点
l 哈希算法接受一段明文后,以一种不可逆的方式,将其转化为一段长度较短、位数固定的散列数据,计算高效。
l collision-free 即冲突概率小,如果两个哈希值是不相同的(根据同一函数),那么这两个哈希值的原始输入也是不相同的;如果两个哈希值相同,两个输入值很可能是相同的,但不绝对肯定二者一定相等(可能出现哈希碰撞)。
l 能够隐藏原始信息:例如区块链中各个节点之间对交易的验证只需要验证交易的信息熵,而不需要对原始信息进行比对,节点间不需要传输交易的原始数据只传输交易的哈希即可,常见算法有SHA系列和MD5等算法。
l 加密过程不可逆,即无法通过输出的散列数据倒推原本的明文是什么。
l 输入的明文与输出的散列数据一一对应,任何一个输入信息的变化,都必将导致最终输出的散列数据的变化,冲突的概率非常小。
B、哈希的用法
哈希在区块链中用处广泛,其一我们称之为哈希指针(Hash Pointer),哈希指针是指该变量的值是通过实际数据计算出来的且指向实际的数据所在位置,即其既可以表示实际数据内容又可以表示实际数据的存储位置。如下图所示:
imageHashPointer在区块链中主要有两处使用,第一个就是构建区块链数据结构,从上面的区块数据结构中就可以知道,每个区块都包含了上一个区块的hash值(即hash pointer),这样的好处在于后面区块可以查找前面所有区块中的信息,而且区块的HashPointer的计算包含了前面区块的信息从而一定程度上保证了区块链的不易篡改的特性。第二个就是用于构建Merkle Tree.,Merkle Tree的各个节点使用HashPointer进行构建。
哈希还在其他技术中有所应用例如:交易验证以及数字签名等等。
区块链资源汇总
区块链学习资源大汇总
http://www.nextblockchain.top/topics/6
区块链常用数据BoltDB数据库源码解析
http://www.nextblockchain.top/categories/boltdb
网友评论