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

    你可能感兴趣的文章
    Webpack 之 basic chunk graph
    查看>>
    Mysql5.7版本单机版my.cnf配置文件
    查看>>
    mysql5.7的安装和Navicat的安装
    查看>>
    mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
    查看>>
    Mysql8 数据库安装及主从配置 | Spring Cloud 2
    查看>>
    mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
    查看>>
    MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
    查看>>
    MYSQL8.0以上忘记root密码
    查看>>
    Mysql8.0以上重置初始密码的方法
    查看>>
    mysql8.0新特性-自增变量的持久化
    查看>>
    Mysql8.0注意url变更写法
    查看>>
    Mysql8.0的特性
    查看>>
    MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
    查看>>
    MySQL8修改密码的方法
    查看>>
    Mysql8在Centos上安装后忘记root密码如何重新设置
    查看>>
    Mysql8在Windows上离线安装时忘记root密码
    查看>>
    MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
    查看>>
    mysql8的安装与卸载
    查看>>
    MySQL8,体验不一样的安装方式!
    查看>>
    MySQL: Host '127.0.0.1' is not allowed to connect to this MySQL server
    查看>>