我在這本書中遇到了ex4.1:
編寫一個函數,用於計算兩個SHA256哈希中不同的比特數。比較兩個數組中的比特
我想到的部分解決方案粘貼在下面,但它是錯誤的 - 它計算不同字節的數量而不是位數。 請你指點我正確的方向?
package main
import (
"crypto/sha256"
"fmt"
)
var s1 string = "unodostresquatro"
var s2 string = "UNODOSTRESQUATRO"
var h1 = sha256.Sum256([]byte(s1))
var h2 = sha256.Sum256([]byte(s2))
func main() {
fmt.Printf("s1: %s h1: %X h1 type: %T\n", s1, h1, h1)
fmt.Printf("s2: %s h2: %X h2 type: %T\n", s2, h2, h2)
fmt.Printf("Number of different bits: %d\n", 8 * DifferentBits(h1, h2))
}
func DifferentBits(c1 [32]uint8, c2 [32]uint8) int {
var counter int
for x := range c1 {
if c1[x] != c2[x] {
counter += 1
}
}
return counter
}
你已經在位元數:8 *的字節數。在Go(或任何其他非嵌入式語言)中逐字閱讀是非常非常奇怪的。你確定這本書(哪本書?)希望你這樣做?否則,看到這個現有的答案:http://stackoverflow.com/questions/29583024/reading-8-bits-from-a-reader-in-golang - 但我可以誠實地說,你應該從來沒有這樣做時,比較哈希在一個真正的節目。 – elithrar
你正在執行的是Hamming Distance,它是一個非常常用和有用的算法。您應該閱讀關於字節的按位操作,並且解決方案並不困難 - 異或兩個字節以獲取僅設置了不同位的字節。然後對比特進行移位計數。 –
@peterSO我不懷疑OP:但是,可能有圍繞他們的帖子中沒有提供的問題的上下文。如果本書確實希望你進行按位操作,那麼在投擲你之前,以前的練習或章節是否會提供一些介紹? (甚至不清楚正在討論哪本書;我認爲它是GoPL)。 – elithrar