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

    你可能感兴趣的文章
    postgres10配置huge_pages
    查看>>
    PostgreSQL 10.0 preview 变化 - pg_xlog,pg_clog,pg_log目录更名为pg_wal,pg_xact,log
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 15章 并行查询_15.2. 何时会用到并行查询?...
    查看>>
    PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.23. 行和数组比较
    查看>>
    PostgreSQL 10.1 手册_部分 III. 服务器管理_第 21 章 数据库角色
    查看>>
    Postgresql 12.9如何配置允许远程连接
    查看>>
    PostgreSQL 9.6 同步多副本 与 remote_apply事务同步级别 应用场景分析
    查看>>
    Postgresql CopyManager 流式批量数据入库
    查看>>
    PostgreSQL cube 插件 - 多维空间对象
    查看>>
    PostgreSQL Daily Maintenance - cluster table
    查看>>
    PostgreSQL on Linux 最佳部署手册
    查看>>
    PostgreSQL Oracle 兼容性之 - pipelined
    查看>>
    PostgreSQL Point-In-Time Recovery (Incremental Backup)
    查看>>
    postgresql Streaming Replication监控与注意事项
    查看>>
    postgresql 不需要付费_使用数据传输在PostgreSQL执行 外部连接运算符
    查看>>
    postgresql 主从配置_生产环境postgresql主从环境配置
    查看>>
    postgresql 函数&存储过程 ; 递归查询
    查看>>
    PostgreSQL 分组聚合查询中 filter 子句替换 case when
    查看>>
    PostgreSQL 同步流复制锁瓶颈分析
    查看>>
    PostgreSQL 备份与还原命令 pg_dump
    查看>>