gpt4 book ai didi

python - Python 内置哈希函数的十六进制摘要

转载 作者:行者123 更新时间:2023-12-01 02:41:22 25 4
gpt4 key购买 nike

我需要从一组嵌套配置值创建一个标识符 token 。 token 可以是 URL 的一部分,因此为了使处理更容易,它应该只包含十六进制数字(或类似的数字)。配置值是嵌套元组,其中包含可哈希类型的元素,例如 intboolstr 等。

我的想法是使用内置的 hash() 函数,因为即使配置结构发生变化,它也会继续工作。这是我的第一次尝试:

def token(config):
h = hash(config)
return '{:X}'.format(h)

这将产生可变长度的标记,但这并不重要。但令我困扰的是, token 可能包含一个前导减号,因为 hash() 的返回值是一个有符号整数。

作为避免该符号的方法,我想到了以下解决方法,即向哈希值添加一个常量。该常量应该是 hash() 值范围大小的一半(这取决于平台,例如,32 位/64 位系统有所不同):

HALF_HASH_RANGE = 2**(sys.hash_info.width-1)

这是一个合理且便携的解决方案吗?还是我会搬起石头砸自己的脚?

我还看到了使用 struct.pack() 的建议(它返回一个 bytes 对象,可以在该对象上调用 .hex() code> 方法),但也需要提前知道哈希值的范围(以便选择正确的格式字符)。

附录:
加密强度或偶然冲突不是问题。在这种情况下,hashlib 库的缺点是它需要编写一个转换器来遍历输入结构并将所有内容转换为 bytes 表示形式,这很麻烦。

最佳答案

您可以使用任何哈希函数来获取唯一的字符串。现在Python支持许多开箱即用的算法,例如:md5、sha1、sha224、sha256、sha384、sha512。您可以在这里阅读更多相关信息 - https://docs.python.org/2/library/hashlib.html

此示例展示了如何使用 hashlib 库。 (Python 3)

>>> import hashlib
>>> sha = hashlib.sha256()
>>> sha.update('somestring'.encode())
>>> sha.hexdigest()
>>> '63f6fe797026d794e0dc3e2bd279aee19dd2f8db67488172a644bb68792a570c'

您也可以尝试库 hashids 。但请注意,它不是哈希算法,您(以及任何了解 salt 的人)可以解密数据。

$ pip install hashids

基本用法:

>>> from hashids import Hashids
>>> hashids = Hashids()
>>> hashids.encode(123)
'Mj3'
>>> hashids.decode('Mj3')
123

关于python - Python 内置哈希函数的十六进制摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45674572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com