博客
关于我
[日常] 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/

    你可能感兴趣的文章
    pandas打乱数据的顺序
    查看>>
    pandas指定列数据归一化
    查看>>
    pandas改变一列值(通过apply)
    查看>>
    Pandas数据分析的环境准备
    查看>>
    Pandas数据可视化怎么做?用实战案例告诉你!
    查看>>
    Pandas数据处理与分析教程:从基础到实战
    查看>>
    Pandas数据结构之DataFrame常见操作
    查看>>
    pandas整合多份csv文件
    查看>>
    pandas某一列转数组list
    查看>>
    Pandas模块,我觉得掌握这些就够用了!
    查看>>
    Pandas玩转文本处理!
    查看>>
    SpringBoot 整合 Mybatis Plus 实现基本CRUD功能
    查看>>
    pandas的to_sql方法中使用if_exists=‘replace‘
    查看>>
    Springboot ppt转pdf——aspose方式
    查看>>
    pandas读取csv编码utf-8报错
    查看>>
    pandas读取parquet报错
    查看>>
    pandas读取数据用来深度学习
    查看>>
    pandas读取文件时,不去掉前面的0 保留原有的数据格式
    查看>>
    Pandas进阶大神!从0到100你只差这篇文章!
    查看>>
    spring5-介绍Spring框架
    查看>>