我是 Python 的新手。我能够取消哈希值吗?或者更确切地说,我如何取消哈希值?我正在使用标准的 hash() 函数。我的目标是首先哈希一个值,将其发送到某个地方,然后再取消哈希:
#process X
hashedVal = hash(someVal)
#send n receive in process Y
someVal = unhash(hashedVal)
#for example print it
print someVal
提前感谢
我是 Python 的新手。我能够取消哈希值吗?或者更确切地说,我如何取消哈希值?我正在使用标准的 hash() 函数。我的目标是首先哈希一个值,将其发送到某个地方,然后再取消哈希:
#process X
hashedVal = hash(someVal)
#send n receive in process Y
someVal = unhash(hashedVal)
#for example print it
print someVal
提前感谢
无法完成。
哈希不是原始值的压缩版本,它是从原始值派生出来的数字(或类似物)。哈希实现的本质是可能的(但如果哈希算法是好的,则在统计上不太可能)两个不同的对象产生相同的哈希值。
这被称为鸽巢原理,基本上是指如果你有N个不同的项目,并想将它们放入M个不同的类别中,其中N的数量大于M(即更多的项目而不是类别),你最终将得到一些包含多个项目的类别。由于哈希值通常比其哈希数据小得多,因此遵循相同的原则。
因此,一旦你拥有哈希值,就无法回溯。您需要一种不同的传输数据的方式。
例如,一个示例(但不是非常好的)哈希算法是计算数字模3(即除以3后的余数)。然后,您将从数字获得以下哈希值:
1 --> 1 <--+- same hash number, but different original values
2 --> 2 |
3 --> 0 |
4 --> 1 <--+
你是想这样使用哈希函数,以便于:
...吗?
了解你为什么要这样做可能会给你一个比“它无法完成”更好的答案。
例如,针对以上三种不同的观察方式,以下是每种方式正确的实现方法:
__hash__
方法与您创建的任何哈希表无关。假设您有一个名为tabby
的哈希表。那么hash(“hello world”)
与某个数字x%len(tabby)
不同。当您对字符串进行哈希,或对元组进行哈希,或在Python中对任何内容进行哈希时,所得到的数字与用户创建的哈希表中条目数量无关。 - Samuel Muldoon__hash__()
定义了==
运算符(或__eq__()
)。例如,我们可以让"hello" == "world"
仅在hash("hello") == hash("world")
时返回True
。如果str
类的每个实例的哈希值都是唯一的,那么理论上可以将它们解密。 - Samuel Muldoonhash()
函数)。basehash
Python库(pip install basehash
)来实现所需功能。import basehash
hash_fn = basehash.base36() # you can initialize a 36, 52, 56, 58, 62 and 94 base fn
hash_value = hash_fn.hash(1) # returns 'M8YZRZ'
unhashed = hash_fn.unhash('M8YZRZ') # returns 1
你可以在哈希函数初始化时定义哈希长度并哈希其他数据类型。
我不会解释各种基数和哈希长度的必要性,对于想要了解更多关于哈希的读者,请自行查找。
hash
也不例外。__hash__()
定义了operator ==
(或__eq__()
)。例如,我们可以使得"hello" == "world"
仅当hash("hello") == hash("world")
时返回True
。如果每个字符串的哈希值是唯一的,那么理论上就有可能将它们解密。 - Samuel Muldoon