我一直在嘗試在Go中實現HashCash算法!對于那些不知道的人-HashCash是一種阻止垃圾郵件的方法?;旧?,頭是由客戶端和服務器都知道的一些環境變量(電子郵件,時間戳等)構成的。隨機隨機數附加到標頭的末尾??蛻舳藝L試通過更改隨機數來強行強制執行部分哈希沖突(例如,前x位為0的情況)。HashCash之所以有效,是因為查找部分哈希沖突并不昂貴。服務器收到此標頭后,便會驗證其中的信息(因此它只能用于一個會話)并計算所得的哈希值。如果前x位為0,則表示已在客戶端計算機上花費了大量時間,用于計算沖突(在spambot上不會發生)對我而言,我只想編寫一個程序,確定客戶端找到x位的部分哈希沖突所花費的時間。我寫了這段代碼,如果int64有x位的哈希沖突,它將返回true / false 。func partialAllZeroes (zeroCount uint8, val int64) (bool, os.Error) { setBitString := "1111111111111111111111111111111111111111111111111111111111111111" unsetBitString := "0000000000000000000000000000000000000000000000000000000000000000" setBitString = setBitString[0:zeroCount-1] unsetBitString = unsetBitString[0:zeroCount-1] zeroTest, e := strconv.Btoi64(setBitString, 2) // 64 0bits zeroes, e := strconv.Btoi64(unsetBitString, 2) // 64 1bits if e != nil { return false, e } result := val & zeroTest switch { case result == zeroes: return true, nil case result != zeroes: return false, nil } return false, os.NewError("")}我當前的問題是我遇到很多類型轉換問題。例如,我只能對int64類型進行操作,因為這就是strconv.Btoi64返回的內容。我還在研究的另一個問題是,哈希函數以字節數組形式返回,我不知道如何將其轉換為int64。以下是我當前的哈希碼-hasher := sha1.New()baseCollisionString := "BASE COLLISION STRING"nonce := "12345"hasher.Write([]byte(strings.Join(baseCollisionString, nonce)))testCollision := hasher.Sum()// Somehow I must convert the first x bits of testCollision into an int64 type, so I can use partialAllZeroes with it
- 3 回答
- 0 關注
- 275 瀏覽
添加回答
舉報
0/150
提交
取消