我是蟒蛇的新手。我可以解开,或者我怎样才能解除价值。我正在使用std hash()函数。我想做的是先将一个值哈希发送到某个地方,然后将其解开:
#process X
hashedVal = hash(someVal)
#send n receive in process Y
someVal = unhash(hashedVal)
#for example print it
print someVal
提前谢谢
答案 0 :(得分:22)
无法完成。
哈希不是原始值的压缩版本,它是原始值的派生的数字(或类似的东西)。哈希实现的本质是,两个不同的对象产生相同的哈希值是可能的(但在统计上不太可能,如果哈希算法是一个好的哈希算法)。
这被称为Pigeonhole Principle,它基本上表明如果您有N个不同的项目,并且想要将它们放入M个不同的类别,其中N个数字大于M(即,多于类别的项目) ,你最终会得到一些包含多个项目的类别。由于散列值的大小通常比散列的数据小得多,因此它遵循相同的原则。
因此,一旦获得哈希值就不可能返回。您需要一种不同的传输数据的方式。
例如,一个示例(但不是非常好的)哈希算法将是计算数模3(即除以3后的余数)。然后,您将从数字中获得以下哈希值:1 --> 1 <--+- same hash number, but different original values
2 --> 2 |
3 --> 0 |
4 --> 1 <--+
您是否尝试以这种方式使用哈希函数以便:
......?
知道你为什么要这样做可能会给你一个更好的答案,而不仅仅是“无法完成”。
例如,对于上述3个不同的观察结果,这里有一种方法可以正确地完成每个观察:
答案 1 :(得分:4)
你不能“unhash”数据,哈希函数由于归类原则而不可逆转
http://en.wikipedia.org/wiki/Hash_function
http://en.wikipedia.org/wiki/Pigeonhole_principle
我认为您正在寻找加密/解密。 (或其他答案/评论中提到的压缩或序列化。)
答案 2 :(得分:4)
即使我的答案迟了近8年,我也想说可以取消数据(但不能使用std hash()
功能)。
之前的答案都是描述加密哈希函数,它们在设计时应该计算不可能的哈希值(或者至少非常难以unhash)。
但是,并非所有哈希函数都是如此。
您可以使用basehash
python lib(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
您可以在哈希函数初始化时定义哈希长度,也可以哈希其他数据类型。
我向那些想要了解更多关于哈希的读者遗漏了对各种基础和哈希长度的必要性的解释。
答案 3 :(得分:0)
一般情况下这是不可能的。哈希函数必然会丢失信息,而python的hash
也不例外。