如何在Go中实现HashCash的算法(类型转换问题)?

我一直在尝试在Go中实现HashCash算法!对于那些不知道的人-


HashCash是一种阻止垃圾邮件的方法。基本上,头是由客户端和服务器都知道的一些环境变量(电子邮件,时间戳等)构成的。随机随机数附加到标头的末尾。客户端尝试通过更改随机数来强行强制执行部分哈希冲突(例如,前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



MMTTMM
浏览 251回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go