登录
首页 >  Golang >  Go问答

查找字符串的最高位和最低位

来源:stackoverflow

时间:2024-02-14 14:54:23 235浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《查找字符串的最高位和最低位》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

我需要在 go 中执行以下操作:

  1. 连接 2 个字符串
  2. 计算连接字符串的 md5 哈希值(128 位数组)
  3. 对 md5 哈希值的 64 个 lsb 和 64 个 msb 应用 xor 运算符。

我可以使用“crypto/md5”包计算字符串的 md5 哈希值,但在实现步骤 #3 时遇到问题。 这是我想出的代码,我认为它不正确,并且没有看到任何从字符串中获取 msb 和 lsb 的链接。

func generatehashkey(s1 string, s2 string) string {
    if s1 == "" {
        return ""
    }

    data := []byte(s1 + s2)
    md5sum := md5.sum(data)
    
    // 0: uint32
    lsb := bytes.newbuffer(md5sum[:9]) // 0-8
    msb := bytes.newbuffer(md5sum[9:]) // 9-16
    return msb ^ lsb; //this results in an error
}

这是一个相应的工作 java 代码,我需要将其转换为 go。

//input is a concatenated string
byte[] str = input.getBytes("UTF-8");
byte[] md5sum = MessageDigest.getInstance("MD5").digest(str);
long lsb =
ByteBuffer.wrap(md5sum).order(ByteOrder.LITTLE_ENDIAN).getLong(0);
long msb =
ByteBuffer.wrap(md5sum).order(ByteOrder.LITTLE_ENDIAN).getLong(8);
return msb ^ lsb;

解决方案


您不能在 bytes.buffer 上使用按位运算符,它仅适用于整数值。您可以使用 encoding/binary 包将字节转换为合适的 64 位值进行 xor,并在此处使用小端字节顺序,如提供的 java 代码所示。

获得该值后,您可以使用 fmt.sprintfstrconv 包根据需要格式化返回的字符串。

func GenerateHashKey(s1 string, s2 string) string {
    data := []byte(s1 + s2)
    md5sum := md5.Sum(data)

    lsb := binary.LittleEndian.Uint64(md5sum[:8])
    msb := binary.LittleEndian.Uint64(md5sum[8:])
    return strconv.FormatUint(lsb^msb, 10)
}

理论要掌握,实操不能落!以上关于《查找字符串的最高位和最低位》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>