區塊鏈中hash算法及go支持

(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

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章