平台本身是用 java 写的,想用 python 同样实现一套,但是使用的终端已经内置了加密算法,所以算法不可变,算法逻辑中间有一段大概是这样:
byte[] value = Utf8.encode(inputString) // 工具类实现字符串转 byte[]
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256")
for (int i = 0; i < 1024; i++) {
value = messageDigest.digest(value);
// 因 java 语言的特性,上面获取摘要的的字节数组是里面是包含负数的,包含负数数据的 byte[]又直接进行摘要。
}
return new String(Hex.encode(value)) // Hex 工具类转成 16 进制字符串
实现相同算法时使用 python3:
sha256 = hashlib.sha256()
bs = bytes(inputString, encoding="utf-8")
sha256.update(bs)
for i in range(0,1023):
sha256.update(sha256.digest()) # 此时拿到的 bytes 与 java 拿到的其实已经是不一样了,所以最终拿到的摘要值也就不同了
print(sha256.hexdigest())
其实平台使用的的摘要方式如果是 1024 次摘要十六进制字符串的摘要
的话,那其实与语言特性就无关了,但是实现方式却是使用连续对字节数组(byte[])进行摘要。python 的 bytes 又不支持负数,导致最终多次计算之后的值不一致。
大佬们看看怎么解决这个问题。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.