区块链中hash算法及go支持

  • Post author:
  • Post category:其他


(1).散列表(Hash table,也叫哈希表),是依据关键码值(Key value)而直接进行訪问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来訪问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

MD5和sha系列算法是应用最广泛的hash算法。hash算法最重要的特点是不可逆和无冲突,在信息安全方面的应用如下几个方面:

1.文件校验

2.数字签名

3.鉴权协议

Hash算法函数根据分类:加法hash、位运算hash、乘法hash、除法hash、查表hash等。

(2).区块链中的hash算法

Hash算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。利用其不可逆行可对明文进行加密,比特币中使用的hash算法位sha-256。

应用:

1.区块链中节点的地址,公钥,私钥计算。以地址为例:公钥经过一次SHA256计算,再进行一次RIPEMD160计算,得到一个公钥哈希(20字节\160比特),添加版本信息,再来两次SHA256运算、取前4比特字节,放到哈希公钥加版本信息后,再经过base58编码,最终得到地址。

2.merkle tree:merkle tree上的叶节点存放hash计算后的hash值,非叶节点是其对应的子节点串联的字符串的hash值。用于区块头和SPV认证中。

3.工作量证明pow:计算的其实就是一个nonce,当这个随机数和其他散列过的数据合并时,产生一个比规定目标小(target)值。挖矿也可以理解一种快速不可逆的计算。SHA256(SHA256(version + prev_hash + merkle_root + ntime + nbits + x )) < TARGET。

4.比特币中的bloom filter布隆过滤器,布隆过滤器基于hash函数的快速查找。解决了客户端检索的问题,原理是Bloom filter可以快速判断出某检索值一定不存在于某个指定的集合,从而可以过滤掉大量无关数据,减少客户端不必要的下载量。

(3)Go语言支持

go crypto标准包包含了一些常用的哈希算法,例如md5、sha1、sha256、sha512等。以sha1算法为例了解go如何生成哈希值。

package main

import (
    "crypto/sha1"
    "fmt"
    "io"
    "log"
    "os"
)

func main() {
    data := []byte("this is test, hello world, keep coding")
    fmt.Printf("%x \n", sha1.Sum(data))

    h := sha1.New()
    io.WriteString(h, "this is test, hello world, keep coding")
    fmt.Printf("%x \n", h.Sum(nil))

    fmt.Printf("%x \n", shaFile("./file.txt"))
}

//shaFile利用sha1算法将目标文件生成哈希值
func shaFile(filePath string) []byte {
    f, err := os.Open("file.txt")
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    h := sha1.New()
    if _, err := io.Copy(h, f); err != nil {
        log.Fatal(err)
    }
    return h.Sum(nil)
}

程序运行结果为:

a1 7b 4a 11 04 95 e1 c4 70 8f a0 33 db 89 d6 f6 13 3d 6a 48
a1 7b 4a 11 04 95 e1 c4 70 8f a0 33 db 89 d6 f6 13 3d 6a 48
ccf59c07592fb103ff88062c924962b6f9839a9b



版权声明:本文为xinsuiqingfeng原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。