我需要从一组嵌套配置值创建标识符标记。
令牌可以是URL的一部分,因此 - 为了使处理更容易 - 它应该只包含十六进制数字(或类似的东西)。
配置值是嵌套元组,包含可用类型的元素,如int
,bool
,str
等。
我的想法是使用内置的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
表示,这很麻烦。
答案 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'