为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
MMTTMM 2021-05-04 13:30:41
我一直在尝试在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
查看完整描述

3 回答

  • 3 回答
  • 0 关注
  • 250 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信