Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有相同长度的完美哈希函数(即无冲突)_Python_Hash - Fatal编程技术网

Python 具有相同长度的完美哈希函数(即无冲突)

Python 具有相同长度的完美哈希函数(即无冲突),python,hash,Python,Hash,我正在寻找一个简单的哈希函数,它不会产生冲突 我有一个字母数字序列(比如16个字母长),我希望它们中的每一个都映射到唯一的散列值。理想情况下,哈希值与原始序列的长度相同(16个字母长) 是否有一个简单的python哈希函数可以实现这一点?如果哈希函数可以返回任何不可变对象,请直接返回字符串。不需要把它们映射成任何东西 def hash(s): return s 如果它需要返回int,那么它很简单。Python整数可以任意大,因此您所要做的就是将字符串转换为具有相同字节的int def

我正在寻找一个简单的哈希函数,它不会产生冲突

我有一个字母数字序列(比如16个字母长),我希望它们中的每一个都映射到唯一的散列值。理想情况下,哈希值与原始序列的长度相同(16个字母长)


是否有一个简单的python哈希函数可以实现这一点?

如果哈希函数可以返回任何不可变对象,请直接返回字符串。不需要把它们映射成任何东西

def hash(s):
    return s
如果它需要返回int,那么它很简单。Python整数可以任意大,因此您所要做的就是将字符串转换为具有相同字节的int

def hash(s):
    return int.from_bytes(string.encode(), byteorder='big')
使用类似

u"".join([unichr(ord(spl[0])*100 + ord(spl[1])-30) for spl in [instr[i: i + 2] for i in range(0, 16, 2)]])
这是一个非常糟糕的转变:

1234567890123456
变为
ጸᐂᓌᖖᙖጸᐂᓌ

aAzZ09jdmekfADEF
变成
☇⿤ዛ⦮⫛⨔ᦊᬜ

IamBADatREQUIREM
变成
᳇⪸ᦊ☺ ΊᲸᬣ

zzaa009990123456
变为
〄☧ዒᙟᙖጸᐂᓌ

可通过以下方式反转:

"".join([chr(ord(num) / 100) + chr(ord(num) % 100 + 30) for num in unistring])
u”〄☧ዒᙟᙖጸᐂᓌ"变为
zzaa009990123456


因此,生命周期是完整的。

哈希函数返回一个相对于哈希函数的固定长度字符串,而不是输入字符串,您需要的是一个密码

当然,您希望验证您的输入…对于字母数字,您可以使用:

isalnum()

你已经给它命名了:它被称为“完美哈希函数”,我想这是在1978年左右的一篇论文中首次描述的。你怎么没有在文献搜索中找到它呢?它可能是一个简单的密码吗?即从每个字符的ascii值中减去5(并循环以确保所有字符都有效)听起来身份散列可以正常工作。如果您想将16个字符的序列散列为16个字符的序列而不发生冲突,
lambda x:x
满足这些要求。我投票结束这个问题,因为这些要求没有定义,提问者在得到其他有效答案后提出了新的要求如果哈希函数的输入为X,则不能始终返回X。“为什么不呢?你需要解释一下原因。如果这是一项安全措施,那就非常可疑。为什么您需要一个完美的哈希,而不是SHA256呢?第一个是不可接受的。我们不能总是返回原始字符串。这是我的要求之一。假设出于安全原因,我们希望映射到其他值
isalnum()