博客
关于我
[日常] Go语言圣经--复合数据类型,数组习题
阅读量:661 次
发布时间:2019-03-15

本文共 1683 字,大约阅读时间需要 5 分钟。

编写一个函数,计算两个SHA256哈希码中不同bit的数目。(参考2.6.2节的PopCount函数)

是一个 Rays 制造的练习。要实现这一目标,我们需要理解如何比较两个哈希算法产生的哈希值的区异位。

函数设计与实现

要实现这一功能,我们首先需要设计一个函数,该函数将接收两个字符串输入,计算每个字符串的SHA256哈希值,然后比较这两个哈希值的区异位数量。

以下是实现步骤:

  • 导入所需包:我们需要使用标准库中的crypto/sha256包。
  • 定义函数签名:函数名为compareSha256,接收两个字符串参数str1str2
  • 计算哈希值
    • 使用sha256.Sum256([]byte(str1))计算str1的哈希值,存储在变量a
    • 使用sha256.Sum256([]byte(str2))计算str2的哈希值,存储在变量b
  • 初始化计数器:创建一个初始化为0的整数变量num,用于存储区异位数量。
  • 逐位比较
    • 遍历哈希值的每个字节。
    • 对于每个字节,将其转换为8位二进制位,并存储在变量m中。
    • 比较这8个二进制位在两个哈希值中的位置。如果有位数不同,则增加计数器num
  • 返回结果:返回区异位的总数`.
  • 具体实现代码

    以下是实现代码的具体实现:

    package mainimport (    "fmt"    "crypto/sha256"    "flag"    "strings")func compareSha256(str1 string, str2 string) int {    a := sha256.Sum256([]byte(str1))    b := sha256.Sum256([]byte(str2))    num := 0        for i := 0; i < len(a); i++ {        m := 1        for m <= 8; m++ {            if (a[i] > uint(m)) != (b[i] >> uint(m)) {                num++            }        }    }        return num}//命令行标志var hashMethod = flag.String("s", "sha256", "请输入哈希算法")//定义一个打印哈希值的函数func printHash(flag_str string) {    if flag_str == "SHA256" {        fmt.Printf("%x\n", sha256.Sum256([]byte("x')))    } else if flag_str == "SHA512" {        fmt.Printf("%x\n", sha512.Sum512([]byte("x")))    } else if flag_str == "SHA384" {        fmt.Printf("%x\n", sha512.Sum384([]byte("x")))    }}

    功能解释

    在上述代码中,我们首先导入了必要的包。然后定义了一个用于比较两个字符串的SHA256哈希值区异位数量的函数compareSha256

    在这个函数中:

  • 使用sha256.Sum256计算两个字符串的哈希值。
  • 初始化计数器num为0。
  • 遍历每个字节,将其转换为8位二进制位,逐位比较两个哈希值的相同性。
  • 如果某一位不同,则计数器num加一。
  • 返回区异位数量.
  • 然后,我们在main函数中定义了一个命令行标志hashMethod 用于指定哈希算法,默认值为sha256

    最后,我们定义了一个函数printHash 用于根据指定的哈希算法打印对应的哈希值。

    这个函数就可以满足问题中练习1的需求。

    在其他练习中,这个思路可以相应扩展,结合其他哈希算法如SHA512SHA384等进行实现。

    此外,用户也可以根据需要自定义其他哈希算法。

    转载地址:http://vvnmz.baihongyu.com/

    你可能感兴趣的文章
    MSBuild 教程(2)
    查看>>
    msbuild发布web应用程序
    查看>>
    MSB与LSB
    查看>>
    MSCRM调用外部JS文件
    查看>>
    MSCRM调用外部JS文件
    查看>>
    MSEdgeDriver (Chromium) 不适用于版本 >= 79.0.313 (Canary)
    查看>>
    MsEdgeTTS开源项目使用教程
    查看>>
    msf
    查看>>
    MSSQL数据库查询优化(一)
    查看>>
    MSSQL数据库迁移到Oracle(二)
    查看>>
    MSSQL日期格式转换函数(使用CONVERT)
    查看>>
    MSTP多生成树协议(第二课)
    查看>>
    MSTP是什么?有哪些专有名词?
    查看>>
    Mstsc 远程桌面链接 And 网络映射
    查看>>
    Myeclipse常用快捷键
    查看>>
    MyEclipse更改项目名web发布名字不改问题
    查看>>
    MyEclipse用(JDBC)连接SQL出现的问题~
    查看>>
    mt-datetime-picker type="date" 时间格式 bug
    查看>>
    myeclipse的新建severlet不见解决方法
    查看>>
    MyEclipse设置当前行背景颜色、选中单词前景色、背景色
    查看>>