zoukankan      html  css  js  c++  java
  • 从sha1的计算例子,理解计算机的数据表示?16进制输出?二进制输出??

    将[]byte转成16进制

    import "crypto/md5"
    import "fmt"
    sign := md5.Sum([]byte("date string"))
    signStr := fmt.Sprintf("%x", sign) //将[]byte转成16进制

    上面这一行就完成了 byte类型转16进制。也就是二进制文件转16进制!!
     
     
     
     

     1.以十进制输出

    package main
    import (
      "crypto/sha1"
      "fmt"
      "io"
    )
    
    func main() {
    
      h := sha1.New()
      io.WriteString(h, "hello")
      fmt.Printf("%d
    ", h.Sum(nil))
    }
                                                  
    

      

    2.已等宽8进制输出 

     package main
     import (
       "crypto/sha1"
       "fmt"
       "io"
     )
     
     func main() {
     
       h := sha1.New()
       io.WriteString(h, "hello")
       fmt.Printf("%8b
    ", h.Sum(nil))
     }
    

      

     ----------------------------

    golang 和php 计算同一个字符串的sha1值,输出的结果不一样??

    package main
    import (
      "crypto/sha1"
      "fmt"
      "io"
    ) 
    
    func main() {
    
      h := sha1.New()
      io.WriteString(h, "hello")
      //fmt.Printf("%x
    ", h.Sum(nil))
      fmt.Printf(h.Sum(nil))
    }
    

     php计算的结果为:

     

     

    结果不同

    why ?

    --------------------------

    Go的代码有点问题,你需要使用%x来强制使用16进制输出。
    比如:

    fmt.Printf("%x
    ", h.Sum(nil))
     
     
     

    你应该以十六进制字符输出才能算是一样的值:

    十六进制输出:
    php: https://tools.vaptu.com/onlin...
    golang: https://tools.vaptu.com/onlin...

    结果一样


    而你的golang算出来的是二进制的,php的 sha1()函数在第二次参数为TRUE的时候则输出二进制。当然输出大部分情况是乱码

      

    ----------------------------------

      

           

         

        可以发现和之前16进制显示的结果也是一样的了!!!

    -------------------------------------------------

    https://www.jb51.net/article/202356.htm

    golang 将[]byte转成16进制的实现

     更新时间:2020年12月17日 11:22:07   作者:-缘故-  
     
    这篇文章主要介绍了golang 将[]byte转成16进制的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

    将[]byte转成16进制

    1
    2
    3
    4
    import "crypto/md5"
    import "fmt"
    sign := md5.Sum([]byte("date string"))
    signStr := fmt.Sprintf("%x", sign) //将[]byte转成16进制

    补充:golang []byte存储存储的16进制转10进制

    项目中有用[]byte存储16进制需要转到10进制,如果用系统自带的函数处理,需要先将[]byte通过hex.EncodeToString转为string,再用strconv.ParseInt转到10进制,过程中由于两次转换导致内存分配过多(每秒执行近100w次),GC出现错误导致进程挂掉。

    自己写了一个函数来转,主要是避免出现内存泄漏:

    var b2m_map map[byte]uint64 = map[byte]uint64{
    	0x00: 0,
    	0x01: 1,
    	0x02: 2,
    	0x03: 3,
    	0x04: 4,
    	0x05: 5,
    	0x06: 6,
    	0x07: 7,
    	0x08: 8,
    	0x09: 9,
    	0x0A: 10,
    	0x0B: 11,
    	0x0C: 12,
    	0x0D: 13,
    	0x0E: 14,
    	0x0F: 15,
    	0x10: 16,
    	0x11: 17,
    	0x12: 18,
    	0x13: 19,
    	0x14: 20,
    	0x15: 21,
    	0x16: 22,
    	0x17: 23,
    	0x18: 24,
    	0x19: 25,
    	0x1A: 26,
    	0x1B: 27,
    	0x1C: 28,
    	0x1D: 29,
    	0x1E: 30,
    	0x1F: 31,
    	0x20: 32,
    	0x21: 33,
    	0x22: 34,
    	0x23: 35,
    	0x24: 36,
    	0x25: 37,
    	0x26: 38,
    	0x27: 39,
    	0x28: 40,
    	0x29: 41,
    	0x2A: 42,
    	0x2B: 43,
    	0x2C: 44,
    	0x2D: 45,
    	0x2E: 46,
    	0x2F: 47,
    	0x30: 48,
    	0x31: 49,
    	0x32: 50,
    	0x33: 51,
    	0x34: 52,
    	0x35: 53,
    	0x36: 54,
    	0x37: 55,
    	0x38: 56,
    	0x39: 57,
    	0x3A: 58,
    	0x3B: 59,
    	0x3C: 60,
    	0x3D: 61,
    	0x3E: 62,
    	0x3F: 63,
    	0x40: 64,
    	0x41: 65,
    	0x42: 66,
    	0x43: 67,
    	0x44: 68,
    	0x45: 69,
    	0x46: 70,
    	0x47: 71,
    	0x48: 72,
    	0x49: 73,
    	0x4A: 74,
    	0x4B: 75,
    	0x4C: 76,
    	0x4D: 77,
    	0x4E: 78,
    	0x4F: 79,
    	0x50: 80,
    	0x51: 81,
    	0x52: 82,
    	0x53: 83,
    	0x54: 84,
    	0x55: 85,
    	0x56: 86,
    	0x57: 87,
    	0x58: 88,
    	0x59: 89,
    	0x5A: 90,
    	0x5B: 91,
    	0x5C: 92,
    	0x5D: 93,
    	0x5E: 94,
    	0x5F: 95,
    	0x60: 96,
    	0x61: 97,
    	0x62: 98,
    	0x63: 99,
    	0x64: 100,
    	0x65: 101,
    	0x66: 102,
    	0x67: 103,
    	0x68: 104,
    	0x69: 105,
    	0x6A: 106,
    	0x6B: 107,
    	0x6C: 108,
    	0x6D: 109,
    	0x6E: 110,
    	0x6F: 111,
    	0x70: 112,
    	0x71: 113,
    	0x72: 114,
    	0x73: 115,
    	0x74: 116,
    	0x75: 117,
    	0x76: 118,
    	0x77: 119,
    	0x78: 120,
    	0x79: 121,
    	0x7A: 122,
    	0x7B: 123,
    	0x7C: 124,
    	0x7D: 125,
    	0x7E: 126,
    	0x7F: 127,
    	0x80: 128,
    	0x81: 129,
    	0x82: 130,
    	0x83: 131,
    	0x84: 132,
    	0x85: 133,
    	0x86: 134,
    	0x87: 135,
    	0x88: 136,
    	0x89: 137,
    	0x8A: 138,
    	0x8B: 139,
    	0x8C: 140,
    	0x8D: 141,
    	0x8E: 142,
    	0x8F: 143,
    	0x90: 144,
    	0x91: 145,
    	0x92: 146,
    	0x93: 147,
    	0x94: 148,
    	0x95: 149,
    	0x96: 150,
    	0x97: 151,
    	0x98: 152,
    	0x99: 153,
    	0x9A: 154,
    	0x9B: 155,
    	0x9C: 156,
    	0x9D: 157,
    	0x9E: 158,
    	0x9F: 159,
    	0xA0: 160,
    	0xA1: 161,
    	0xA2: 162,
    	0xA3: 163,
    	0xA4: 164,
    	0xA5: 165,
    	0xA6: 166,
    	0xA7: 167,
    	0xA8: 168,
    	0xA9: 169,
    	0xAA: 170,
    	0xAB: 171,
    	0xAC: 172,
    	0xAD: 173,
    	0xAE: 174,
    	0xAF: 175,
    	0xB0: 176,
    	0xB1: 177,
    	0xB2: 178,
    	0xB3: 179,
    	0xB4: 180,
    	0xB5: 181,
    	0xB6: 182,
    	0xB7: 183,
    	0xB8: 184,
    	0xB9: 185,
    	0xBA: 186,
    	0xBB: 187,
    	0xBC: 188,
    	0xBD: 189,
    	0xBE: 190,
    	0xBF: 191,
    	0xC0: 192,
    	0xC1: 193,
    	0xC2: 194,
    	0xC3: 195,
    	0xC4: 196,
    	0xC5: 197,
    	0xC6: 198,
    	0xC7: 199,
    	0xC8: 200,
    	0xC9: 201,
    	0xCA: 202,
    	0xCB: 203,
    	0xCC: 204,
    	0xCD: 205,
    	0xCE: 206,
    	0xCF: 207,
    	0xD0: 208,
    	0xD1: 209,
    	0xD2: 210,
    	0xD3: 211,
    	0xD4: 212,
    	0xD5: 213,
    	0xD6: 214,
    	0xD7: 215,
    	0xD8: 216,
    	0xD9: 217,
    	0xDA: 218,
    	0xDB: 219,
    	0xDC: 220,
    	0xDD: 221,
    	0xDE: 222,
    	0xDF: 223,
    	0xE0: 224,
    	0xE1: 225,
    	0xE2: 226,
    	0xE3: 227,
    	0xE4: 228,
    	0xE5: 229,
    	0xE6: 230,
    	0xE7: 231,
    	0xE8: 232,
    	0xE9: 233,
    	0xEA: 234,
    	0xEB: 235,
    	0xEC: 236,
    	0xED: 237,
    	0xEE: 238,
    	0xEF: 239,
    	0xF0: 240,
    	0xF1: 241,
    	0xF2: 242,
    	0xF3: 243,
    	0xF4: 244,
    	0xF5: 245,
    	0xF6: 246,
    	0xF7: 247,
    	0xF8: 248,
    	0xF9: 249,
    	0xFA: 250,
    	0xFB: 251,
    	0xFC: 252,
    	0xFD: 253,
    	0xFE: 254,
    	0xFF: 255,
    }
    func hex2int(hexB *[]byte) uint64 {
    	var retInt uint64
    	hexLen := len(*hexB)
    	for k, v := range *hexB {
    		retInt += b2m_map[v] * exponent(16, uint64(2*(hexLen-k-1)))
    	}
    	return retInt
    }
    func exponent(a, n uint64) uint64 {
    	result := uint64(1)
    	for i := n; i > 0; i >>= 1 {
    		if i&1 != 0 {
    			result *= a
    		}
    		a *= a
    	}
    	return result
    }
    

      

    经过测试,性能和自带的方法接近,略有提升。

    1
    2
    3
    4
    5
    6
    7
    goos: windows
    goarch: amd64
    pkg: benchmark
    Benchmark_General-4     10000000        144 ns/op
    Benchmark_Better-4      10000000        128 ns/op
    PASS
    ok  benchmark   3.086s

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

      

  • 相关阅读:
    解决Docker时区与主机时区不一致的问题
    删除k8s中一直处于Terminating的资源
    多块盘制作成一个lvm
    Docker mysql启动自动按顺序导入sql
    linux中nfs启动报rpcbind.socket failed to listen on sockets: Address family not supported by protocol
    k8s容器挂载配置文件
    ssh到远程执行命令并返回
    安全组
    Python 字符串操作函数二
    Python 字符串操作函数一
  • 原文地址:https://www.cnblogs.com/oxspirt/p/14505586.html
Copyright © 2011-2022 走看看