用于Python内置哈希函数的十六进制摘要

时间:2017-08-14 12:28:45

标签: python hash hexdump

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

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

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

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

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

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

这是一个理智且便携的解决方案吗? 或者我会用脚拍自己的脚?

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用任何哈希函数来获取唯一字符串。现在python支持开箱即用的很多算法,如:md5,sha1,sha224,sha256,sha384,sha512。您可以在此处详细了解相关信息 - https://docs.python.org/2/library/hashlib.html

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

GL_POINTS

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

        List<SubmissionStatus> result = jdbcTemplate.query(
            FINDALL_SQL,
            (rs, rowNum) -> new SubmissionStatus(
                    rs.getLong("subm_rec_id"),
                    rs.getLong("subm_file_id"),
                    rs.getString("contract_id"),
                    rs.getString("contract_name"),
                    rs.getString("status"))
    );

基本用法:

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