Python unhash值

时间:2010-06-09 14:19:22

标签: python hash

我是蟒蛇的新手。我可以解开,或者我怎样才能解除价值。我正在使用std hash()函数。我想做的是先将一个值哈希发送到某个地方,然后将其解开:

#process X
hashedVal = hash(someVal)
#send n receive in process Y
someVal = unhash(hashedVal)
#for example print it
print someVal

提前谢谢

4 个答案:

答案 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个不同的观察结果,这里有一种方法可以正确地完成每个观察:

  • 压缩/解压缩,例如使用gzip或zlib(大多数编程语言/运行时通常可用的两种)
  • 加密/解密,例如使用RSA,AES或类似的安全加密算法
  • 序列化/反序列化,这是为了获取复杂的对象层次结构并生成二进制或文本表示形式的代码,以后可以将其反序列化为新对象

答案 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也不例外。