一、base58
base58和base64一样是一种二进制转可视字符串的算法,主要用来转换大整数值。区别是,转换出来的字符串,去除了几个看起来会产生歧义的字符,如 0 (零), O (大写字母O), I (大写的字母i) and l (小写的字母L) ,和几个影响双击选择的字符,如/, +。
结果字符集正好58个字符(包括9个数字,24个大写字母,25个小写字母)。
编码流程 (本质为大数与字符串的转化)
输入为bytes,比如:[0x00, 0xFF]
忽略前面的0x00得到数字256
256通过base58编码为字符串”5Q”,因为要处理0x00,所以得到字符串”15Q”
把字符串“15Q”转化为bytes: [0x49, 0x53, 0x81]
二、ripemd160
哈希值的输出值一般是16
进制的字符串。而16
进制字符串,每两个字符占一个字节。我们知道,一个字节=8bit
.
以sha256
为例:
- 256bit->64
位16
进制字符。
package main
import (
"fmt"
"crypto/sha256"
)
func main() {
hasher := sha256.New()
hasher.Write([]byte("The quick brown fox jumps over the lazy dog"))
hashBytes := hasher.Sum(nil)
hashString := fmt.Sprintf("%x", hashBytes)
fmt.Println(hashString)
}
$ d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592
而ripemd
:
- 160bit->40
位16
进制字符。
cdcdGOPATH/src
mkdirgolang.orgmkdirgolang.org cd golang.org
mkdirxmkdirx cd x
$ git clone https://github.com/golang/crypto.git
package main
import (
"fmt"
"golang.org/x/crypto/ripemd160"
)
func main() {
hasher := ripemd160.New()
hasher.Write([]byte("The quick brown fox jumps over the lazy dog"))
hashBytes := hasher.Sum(nil)
hashString := fmt.Sprintf("%x", hashBytes)
fmt.Println(hashString)
}
$ 37f332f68db77bd9d7edd4969571ad671cf9dd3b