python的编码与hash函数的使用

目录

编码

Python里面的hash函数

以sha256为例:

1.加密字符串:

      加盐—级联(update):

2.加密数字

str↔bytes


编码

  • ASCII表:用8 bit 表示英文中所有的字符。
  • GB2312:由于中国汉字过多,而1字节最多表示256个字符,于是对ASCII表进行了一个扩展,后续继续扩展为GB18030。
  • Unicode:为每种语言中的每个字符设定了统一并且唯一的二进制编码。规定所有字符用两个字节表示。
  • UTF :Unicode字符集转换格式,即将Unicode定义的数字转换成程序数据。对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同,中文文本占三字节。

UTF-8、UTF-16、UTF-32分别以BYTE(无符号8位整数)、WORD(无符号16位整数)、DWORD(无符号32位整数)作为编码单位。

以下均是python语言上的讨论,不涉及C/C++。

python的字符串默认是Unicode编码:

                        Unicode编码:str类型(字符串)——"xxxxx"

                        utf-8编码:bytes类型(二进制字符串类型数据)——b'xxxxx'

1.Unicode编码转换成其他编码: str.encode()   #默认是utf-8编码,str→bytes

2.其他编码转换成Unicode编码: str.decode()   #也就是转换成一般字符串 bytes→str

3.a,b编码转换:a编码先转化为Unicode编码,再由Unicode转换成b编码

Python里面的hash函数

python自带的hashlib库,hashlib是涉及安全散列和消息摘要,提供多个不同的加密算法接口,如SHA1、SHA224、SHA256、SHA384、SHA512、MD5等。

hash()函数其参数的数据类型:bytes类型

1.字符串 / 数字 转换为 bytes类型

字符串:m.encode() /  bytes(m,encoding="utf-8")   转换为utf-8编码(bytes类型)

数字:    bytes(n)            直接转换成bytes类型

2.hash值的类型:

hash.digest():    返回2进制字符串类型的hash值(bytes类型)

hash.hexdigest()返回16进制字符串类型的hash值(str类型)

hash.update(n.encode())    返回hash(m||n)的值(级联)

3.str类型↔int类型

int→16进制字符串:hex(123)="0x7b"

16进制字符串→int:int("7b",16)=123

以sha256为例:

1.加密字符串:

from hashlib import sha256
m="crypto"
# m.encode()字符串变成utf-8编码格式,才能用sha256加密
# sha256().hexdigest()  表示返回摘要,作为十六进制数据字符串值
#int("0xa",16)    将16进制字符串转换成int
hash=sha256(m.encode())        
e=int(hash.hexdigest(),16)    # e为int类型 

#下面两种str->bytes方式相同
m.encode()
bytes(m,encoding="utf-8")

e=int(sha256(m.encode()).hexdigest(),16)

另一种方式: 

import hashlib
m="crypto"

sha256=hashlib.sha256()         
sha256.update(m.encode())        #不可将该式赋值,因为返回值为空
print(sha256.digest())           #不可写sha256.updata(m.encode()).digest(),因为            
                                 #sha256.updata(m.encode())返回值为空
#下面两者相同:
"crypto".encode()   
b'crypto'
  1.  m.encode() / bytes(m,encoding="utf-8")              转换成 bytes类型,才能加密 
  2. sha256(m.encode())                                   加密得到_hashlib.HASH类型(中间形式)
  3. sha256(m.encode()).hexdigest()               返回 16进制字符串类型 的hash值
  4. int(sha256(m.encode()).hexdigest(),16)      将16进制字符串转换成 int类型

类型转换:字符串→bytes类型→_hashlib.HASH类型→16进制字符串→int

"crypto"

b'crypto'

<sha256 HASH object @ 0x000001BEB9C02C10>

da2f073e06f78938166f247273729dfe465bf7e46105c13ce7cc651047bf0ca4 

98687292787671481785167033227923050838847915443362959793501195795748475571364

 digest()二进制字符串(bytes类型):

b'\xda/\x07>\x06\xf7\x898\x16o$rsr\x9d\xfeF[\xf7\xe4a\x05\xc1<\xe7\xcce\x10G\xbf\x0c\xa4'

      加盐—级联(update):

from hashlib import sha256

salt="123"  #盐
pwd="ccc"
hash = sha256(salt.encode('utf8'))     #得到盐的hash值
hash.update(pwd.encode('utf8'))                #得到 slat||pwd 的hash值
hash_value = hash.hexdigest()                  #返回十六进制字符串形式

#另一种写法,直接hash(salt||pwd)
hash=sha256(salt+pwd.encode('utf8')) 
hash_value = hash.hexdigest()

2.加密数字

文本:Unicode编码,由str类型表示

二进制数据:bytes类型表示,bytes是一种比特流。

s="crypto"
b = bytes(s, encoding='utf-8')
print(b)
输出:b'crypto'                         #英文字符的bytes类型和str类型内容一样

s="中国"
b = bytes(s, encoding='utf-8')
print(b)
输出:b'\xe4\xb8\xad\xe5\x9b\xbd'      #中文字符不一样,\xe4占1字节,每个汉字占3字节

整型数字得到bytes类型,可以直接 bytes(n)

from hashlib import sha256

n=123
e=sha256(bytes(n)).hexdigest()
print(e)
print(int(e,16))

str↔bytes

bytes→ str                                                  str→bytes
s1=str(n,encoding="utf-8")    str函数          b2=bytes(m,encoding="utf-8")  bytes函数
s2=n.decode()                       编码              b1=m.encode()                         编码

m="123"   #str类型
n=b'456'  #bytes类型

#bytes-> str
s1=str(n,encoding="utf-8")    #str函数
s2=n.decode()            

#str->bytes
b1=bytes(m,encoding="utf-8")  #bytes函数
b2=m.encode()

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值