Python中的__hash__函数

时间:2014-02-16 05:06:48

标签: python hash

我正在尝试理解我目前正在处理的一段代码(它的pacman)。

我在Python中有以下2D数组:

self.data = [[initialValue for y in range(height)] for x in range(width)]

变量initialValue默认为F.因此,数组是包含值&f;#F;对于列表中的每个元素(如此):

    # F F F F
    # F F F F 
    # F F F F 

现在我的代码执行以下操作 - 我确实理解了这一部分,但考虑将其包括在内,以防它对我的问题很重要:

def __getitem__(self, i): 
        return self.data[i]  

def __setitem__(self, key, item):
       self.data[key] = item 

def __str__(self):         
       out = [[str(self.data[x][y])[0] for x in range(self.width)] for y in range(self.height)] 
       out.reverse()                                    #reverses the oder of with the last row of the two dimensional array becoming the first row.
       return '\n'.join([''.join(x) for x in out])      #every line is appended with a space '' followed by a line-break with '\n'

后者通过使用\ n标界符将网格变成了F的棋盘。         #F F F.         #F F F.         #F F F.         #F F F

def __eq__(self, other):                               # The __eq__ method compares other instances of the class with itself
      if other == None: return False
      return self.data == other.data

def __hash__(self): 
      # return hash(str(self))
      base = 1
      h = 0
      for l in self.data:
          for i in l:
              if i:
                  h += base
              base *= 2
      return hash(h) 

我碰巧理解其中的大部分内容, *但是当涉及_ 哈希 _功能时我迷失了。*

我研究了哈希表和哈希表,但我似乎无法找到函数hash()对变量h的作用?

令我困惑的是:

1。看起来我们在这里基于self.data创建了某种哈希表,但似乎我们将这个哈希表留空了?我们为什么要这样做?

2。在我看来,_ hash _函数中的循环以某种方式与生成密钥相关联。

在这个阶段,我可以想象h是某种形式的关键。每次通过循环时,键本身的值似乎都会增加。

令我困惑的是桌子实际上是什么样的?

这是吗?

    # 1 - value
    # 2 - value 
    # 3 - value
    # 6 - value
    # 7 - value
    # 8 - value

等...

第3。任何人都可以向我指出一个资源,它可以让我了解哈希(h)在程序上的作用吗?

非常感谢您阅读此内容并希望提供帮助。

迈克

2 个答案:

答案 0 :(得分:2)

__hash__()函数只返回一个整数。它是从内置函数hash()调用的。

哈希函数的关键属性是,如果两个板是等效的,则在它们上调用__hash__将给出相同的数字。如果电路板不同,那么它们的散列是不同的(但不是必需的)。

哈希函数最常用于哈希表,但哈希函数本身不会创建或使用哈希表。对hash(h)的调用只是将h从可能很大的数字转换为32位整数。

答案 1 :(得分:2)

  
      
  1. 看起来我们在这里基于self.data创建了某种哈希表,但似乎我们将这个哈希表留空了?我们为什么要这样做?
  2.   

您显示的代码不会创建哈希表。相反,如果Grid对象用作哈希表中的键,则其__hash__方法将用于为其生成哈希码。

  
      
  1. 在我看来,__hash__函数中的循环以某种方式与生成密钥相关联。
  2.   

事实上。它生成的密钥是对象的哈希码。

  
      
  1. 任何人都可以指向一个资源,让我了解哈希(h)在程序上的作用吗?
  2.   

hash(h)返回h的哈希码。散列码是与对象关联的数字,对于相等对象保证相等,对于不同对象不太可能相等;它们用于在哈希表中查找对象。对于整数,hash(h)通常是整数本身。