Python2.x 中文md5编码问题

Python2.x hashlib 中文MD5 UnicodeEncodeError

Python2的默认编码是ASCII,不能识别中文字符,需要显式指定字符编码;Python3的默认编码为Unicode,可以识别中文字符。
在Python2.x中采用hashlib进行md5直接加密中文字符可能会出现

UnicodeEncodeError: 'ascii' codec can't encode characters
  • 首先要在模块的头部,即代码文件的顶部作如下声明:
# -*- coding: UTF-8 -*-

# coding=utf-8

该声明为了告诉Python解释器,按照UTF-8编码读取源代码

  • 其次要确保.py文件是utf-8编码

虽然以上都设置好了,但也有可能因为开发环境问题出现UnicodeEncodeError问题
在Python2.x中采用hashlib进行中文md5加密,可以先对中文字符串进行utf-8编码,然后在进行md5加密,如

s = '中文'
hashlib.md5(s.encode('utf-8')).hexdigest()

或通过unicode编码声明,指定字符串Unicode编码规则

s = u'中文'
hashlib.md5(s).hexdigest()

uft-8和unicode两种不同编码规则,但都可以编码中文字符串,只是占用的存储空间不同。

参考

Python中的字符串与字符编码

Python字符串和编码

Unicode

以下是Python语言实现的MD5算法代码: ```python import math import struct # 定义MD5算法所需的常数 T = [int(abs(math.sin(i + 1)) * 2**32) for i in range(64)] # 定义左移函数 def left_rotate(x, n): return ((x << n) & 0xffffffff) | (x >> (32 - n)) # 定义MD5算法的核心函数 def md5(message): # 定义四个缓冲区 a0 = 0x67452301 b0 = 0xefcdab89 c0 = 0x98badcfe d0 = 0x10325476 # 对消息进行预处理 length = len(message) message += b'\x80' while (len(message) * 8) % 512 != 448: message += b'\x00' message += struct.pack('<Q', length * 8) # 进行分块处理 chunks = [message[i:i+64] for i in range(0, len(message), 64)] for chunk in chunks: # 初始化缓冲区 a, b, c, d = a0, b0, c0, d0 # 进行64轮迭代 for i in range(64): if i < 16: f = (b & c) | ((~b) & d) g = i elif i < 32: f = (d & b) | ((~d) & c) g = (5 * i + 1) % 16 elif i < 48: f = b ^ c ^ d g = (3 * i + 5) % 16 else: f = c ^ (b | (~d)) g = (7 * i) % 16 # 计算新的a, b, c, d temp = d d = c c = b b = b + left_rotate((a + f + T[i] + struct.unpack('<I', chunk[4*g:4*g+4])[0]), 7) a = temp # 更新缓冲区 a0 = (a0 + a) & 0xffffffff b0 = (b0 + b) & 0xffffffff c0 = (c0 + c) & 0xffffffff d0 = (d0 + d) & 0xffffffff # 将结果转换为十六进制字符串 return '{:08x}{:08x}{:08x}{:08x}'.format(a0, b0, c0, d0) ``` 使用方法: ```python message = b'The quick brown fox jumps over the lazy dog' print(md5(message)) # 输出结果:9e107d9d372bb6826bd81d3542a419d6 ``` 这里的`message`是待加密的消息,以字节串的形式表示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值