荆州松滋网站建设quot 网站建设话术 quot
2026/4/15 11:09:12 网站建设 项目流程
荆州松滋网站建设,quot 网站建设话术 quot,做网站要怎样加盟欧普,农村创业哈希函数是什么 一种将任意长度的输入映射为固定长度输出的函数。这个输出通常称为哈希值、散列值或摘要。 也就是说将一个数据#xff0c;可以是任何类型#xff0c;数字、字符串输入#xff0c;返回一个固定长度的二进制数据。 比方说#xff0c;输入 hello 世界…哈希函数是什么一种将任意长度的输入映射为固定长度输出的函数。这个输出通常称为哈希值、散列值或摘要。也就是说将一个数据可以是任何类型数字、字符串输入返回一个固定长度的二进制数据。比方说输入hello 世界返回一串儿固定长度的二进制数据 0001010010101 之类的这里有几个新手误区哈希函数返回的原始数据是二进制数据二进制是给机器看的在高级编程语言中直接打印可能会有乱码的再次说明哈希函数的结果值不是字符串哈希函数的结果以hello 世界的哈希结果值010100100为例010100100是一个纯粹的二进制数据不夹杂任何业务它不是10进制的164也不是10进制164对应的ASCII值也不是10进制164对应的UTF-8编码值所以你直接打印是会出现乱码的准确来说它就是一个不代表任何下游业务的纯二进制值在下游业务中哈希函数的结果值最终是要存储的例如存储到数据库中以哈希函数的md5实现来说比方说md5(hello 世界)返回的是01000101010……二进制直接将这个值存储到数据库中是没有问题的。但是将01000101010……这玩意儿存数据库人看起来起来太累了大家都通常将其转换为16进制b4bfe0a9f9281daa04ab2649e1059732,在业务层这就是个字符串存储起来就方便多了所以大家千万不要误解为哈希函数的结果是一个字符串这是不正确的这只是业务层的加工而已你非要把它转化为10进制、8进制也是可以的再次重申哈希函数的结果值二进制数据没有任何业务意义就好比你讲哈希值01000101010……转化成16进制它就成了编程语言中的字符串类型你自己写一套编码映射表你把它转化成表情包也行这是业务自身的事情md5函数算法只是哈希函数的其中一种实现还有很多其他的哈希函数例如 sha1、sha256、sha512 等不同哈希函数返回结果值是不同的长度也会不同一个具体案例以这个在线哈希的网站为例https://www.sojson.com/md5/支持32位[大]32位[小]16位[大]16位[小]其中 “大/小” 的意思是出现字母时字母的大小写md5算法的结果输出是 128 位16 字节的二进制哈希值对hello world进行md5结果为16个字节的二进制我转化成10进制方便查看[94, 182, 59, 187, 224, 30, 238, 208, 147, 203, 34, 184, 245, 172, 220, 51]刚好16个字节对每一个字节转化成16进制例如94-5e182-b659-3b…最后拼接成1个字符串5eb63bbbe01eeed093cb22bb8f5acdc3大写就是5EB63BBBE01EEED093CB22BB8F5ACDC3md5的结果是16个字节16进制的位数是2个字符16x2刚好是32位的md5业务值16位的md5值是什么❓去掉32位md5业务值的前8位和后8位5eb63bbbe01eeed093cb22bb8f5acdc3中间这个就是16位的md5值加密加密是什么能支持解密的才能称为加密字符串md5是一种哈希算法的实现的哈希值十六进制显示是cc5548b16df30f116f72304c32738f5a你在数据库里存储了这条记录这时你知道这个哈希值是的原始值是md5是一种哈希算法的实现但如果只给你cc5548b16df30f116f72304c32738f5a你是无法倒推出其原始值的这正是哈希函数的特性通过哈希结果值无法倒推出原始值也就无法作为加密函数使用哈希函数的结果应用以javac#cpython这四个值计算其哈希为例编号原值哈希值哈希冲突1java10100100❌2c#101111013c11110014python10100100❌java和python的哈希值是相同的这是正常情况(几率很低)这种就称为哈希冲突在下游业务应用时要实现100%的匹配精准所以会有一些业务层的二次处理例如开放寻址、链地址法等但底层哈希算法中一个值对应世界上一个唯一的哈希值目前还无法技术实现还有一点要注意的是一个值哈希值是幂等的一年前执行md5(hello world)哈希值是value1一年后执行md5(hello world)哈希值依旧是value1一种最出色的实现散列表O(1)复杂度查询思想嵌入了几乎所有的编程语言及数据库底层O(1)原理: https://blog.csdn.net/qq_37485347/article/details/154653182编程体现现: https://blog.csdn.net/qq_37485347/article/details/142171291go 语言的实现MurmurHash3 哈希函数MurmurHash3 是一个出色的哈希函数实现主要特点是快,冲突碰撞少哈希函数执行快也就意味着其性能高适合高频次大量运算packagehashimport(github.com/spaolacci/murmur3)funcHash(data[]byte)uint64{returnmurmur3.Sum64(data)}这个包github.com/spaolacci/murmur3对哈希结果值(二进制)进行了转化默认支持返回uint32uint64两种类型output:7236082610745944782md5 哈希函数标准库 [crypto.md5] 哈希函数返回值进行过了转化将二进制数据转化成了[]byte类型packagehashimport(crypto/md5)funcMd5(data[]byte)[]byte{digest:md5.New()digest.Write(data)// 流式写入returndigest.Sum(nil)}使用时funcTestMurmur3(t*testing.T){text:hello, world!\nmd5:Md5([]byte(text))t.Log(md5)// t.Log 默认10进制显示}直接打印会输出 output[145 12 139 199 49 16 176 205 27 197 210 188 174 120 37 17]如果程序写成funcTestMurmur3(t*testing.T){text:hello, world!\nmd5:Md5([]byte(text))t.Log(string(md5))}这种会输出乱码的前面已经说过了哈希函数的返回值是二进制数据没有业务意义它不是utf-8/unicode/ascii码的值就是一个纯粹的二进制数据标准库将其转化成了[]byte转化后的[]byte自然也是没有任何业务意义的❓string()用法是干嘛的❓字节数组➡️字符的编码转化按 UTF-8/ASCII/unicode 规则解析每个字节字节数组本身是合法字符编码如 UTF-8/ASCII 字符串的字节时使用比方说拿一个不是UTF-8字符的[]byte非要使用string()那肯定会出现乱码不是乱码也不是想要的值go 中的存储展示开发者大多喜欢将其转为十进制数字类型或者十六进制字符串类型存储16进制有abcd的字符编程语言中体现为字符串类型10进制就是编程语言中的int类型了例如funcMd5(data[]byte)[]byte{digest:md5.New()digest.Write(data)// 流式写入returndigest.Sum(nil)}funcTestMurmur3(t*testing.T){text:hello, world!\nmd5:Md5([]byte(text))// 16进制输出t.Log(hex.EncodeToString(md5))// t.Logf(%x, md5)// 10进制输出t.Logf(%d,md5)}output:910c8bc73110b0cd1bc5d2bcae782511 [145 12 139 199 49 16 176 205 27 197 210 188 174 120 37 17]转换16进制时尽量使用标准库的hex包性能要比占位符%x方式方式要高hex.EncodeToString会对[]byte转换16进制后的值拼接所以才看到了一个字符串

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询