我要怎麼估算自己機台 CPU 的算力(Hash Rate)?
Bitcoin 主要使用 SHA256 為演算法.它單向雜湊函數 (one-way hash function)的一種.
什麼是 單向雜湊函數 (one-way hash function)?
One Way Hashes 主要會產生一組固定長度字串 (fingerprint or message digests),這組字串用來比對原資料是否遭到修改,它的特性如下
- 原資料輸入長度為可變
- 輸出的 fingerprint 為固定長度
- 當資料任何 byte 改變時, fingerprint 也會變的完全不同
- 我們無法依據 fingerprint 來回推成原資料,這也是為什麼稱為 One Way hash(單方向的資料運算,函數多對一的特性)
既然無法回推成原資料,那怎知資料是否正確, One Way hash 會再將資料再做一次 One Way hash 然後直接比對 fingerprint 是否一樣. md2, md5, mdc2, rmd160, sha1, sha256, sha512, haval, crc-32 皆是採用 One Way hash
SHA-256 可以輸入的 最大訊息長度(位元bit) 為2 64-1, 輸出的摘要長度(位元組 byte) 為 32 ,也就是說不管資料量有多大,固定輸出就是 32 bytes.
在 Linux 系統下有什麼工具可以來估算你的 SHA256 的速度?可以使用 openssl speed sha256
測試環境為 Ubuntu 16.04 x86_64
openssl speed sha256
透過 SSL 作 sha256 hash,是計算該系統的 sha256 hash 會有多快.
root@ubuntu:~# openssl speed sha256 Doing sha256 for 3s on 16 size blocks: 8744167 sha256's in 3.02s Doing sha256 for 3s on 64 size blocks: 4731745 sha256's in 3.01s Doing sha256 for 3s on 256 size blocks: 2298368 sha256's in 3.01s Doing sha256 for 3s on 1024 size blocks: 713351 sha256's in 3.02s Doing sha256 for 3s on 8192 size blocks: 95872 sha256's in 3.01s OpenSSL 1.0.2g 1 Mar 2016 built on: reproducible build, date unspecified options:bn(64,64) rc4(16x,int) des(idx,cisc,16,int) aes(partial) blowfish(idx) compiler: cc -I. -I.. -I../include -fPIC -DOPENSSL_PIC -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -m64 -DL_ENDIAN -g -O2 -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DMD32_REG_T=int -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM -DECP_NISTZ256_ASM The 'numbers' are in 1000s of bytes per second processed. type 16 bytes 64 bytes 256 bytes 1024 bytes 8192 bytes sha256 46326.71k 100608.53k 195475.82k 241877.95k 260924.73k
第一行執行 sha256 做 one-way hash 處理了 8744167 個 16byte 的資料,需要 3.02 秒,接下來使用不同大小的資料 (依序測試 16 , 64 , 256 , 1024 , 8192 byte ) 做相同的測試.
Doing sha256 for 3s on 16 size blocks: 8744167 sha256's in 3.02s
最後面是結果總整理, 數字說明每秒可以處理的 bytes 數 (單位是 K (1000))
前面 16 byte * 8744167 個區塊 / 3.02 秒,後面算出一次處理 區塊大小為 16byte 的資料透過 SSL SHA256 可以處理 46326.71kbyte (k=1000) 的資料量.
指令 openssl 是透過 GPU 來運算,如果是要透過 GPU 來運算需要找其他工具?才能做.
實際用 sha256 做 hash 可以透過下面兩個指令.
openssl dgst -sha256
root@ubuntu:~# openssl dgst -sha256 /etc/passwd SHA256(/etc/passwd)= 543fff87547d3afa2ae509ec7fa91be011777e4b4b9bfe98a7d1995e65903e99
root@ubuntu:~# openssl dgst -sha256 -c /etc/passwd SHA256(/etc/passwd)= 54:3f:ff:87:54:7d:3a:fa:2a:e5:09:ec:7f:a9:1b:e0:11:77:7e:4b:4b:9b:fe:98:a7:d1:99:5e:65:90:3e:99
sha256sum
root@ubuntu:~# sha256sum /etc/passwd 543fff87547d3afa2ae509ec7fa91be011777e4b4b9bfe98a7d1995e65903e99 /etc/passwd