Python 字符串比较函数()
我在网上找到了一段Python代码(http://www.exploit-db.com/exploits/18305/),现在对其中一段代码感到困惑。
老实说,我不太懂Python,但我在其他编程语言上有一些经验。
这个叫做 _computeCollisionChars
的方法会生成一些字符,然后如果这些字符是不同的,就把它们添加到一个字典里。下面是这个方法的定义和与问题相关的部分。注意:具体的代码可以在链接的源代码中找到。
def _computeCollisionChars(self, function, count, charrange):
baseStr = ""
baseHash = function(baseStr) # What is this?
for item in source:
tempStr = ""
if tempStr == baseStr:
continue
if function(tempStr) == baseHash: # What type of comparison is this?
# logic goes here...
return
我有几个问题:
- 方法定义中的
function
参数是什么意思? - 最重要的是
function(string)
是干什么的?为什么要进行两次检查,function(tempStr)
会产生什么样的输出呢?
非常感谢大家!
2 个回答
在Python中,函数被视为一等公民,这意味着你可以把函数当作参数传递给其他函数。这就是为什么function(baseStr)
是在调用传递给_computeCollisionChars的函数对象。
需要注意的是,Python并不会检查传递的参数是否真的是一个函数对象,它只是默认这样做。如果传递的不是函数,程序就会崩溃,并抛出一个TypeError
异常。
>>> def f1():
print "Hello world"
>>> def f2(function):
function()
>>> f2(f1)
Hello World
>>> f2("not a callable function")
TypeError: 'str' object is not callable
看起来你可以把任何可以调用的对象当作 function
传给 _computeCollisionChars
。然后,baseHash
会被初始化为用空字符串作为参数调用 function
的结果。在循环里面,有个条件是:如果用空字符串作为参数调用 function
的结果等于 baseHash
,就执行某些操作。这有点没意义,因为 tempStr
总是 ''
,而 baseHash
也不会改变(或者你没有发那部分代码)。
在当前的代码片段中,第二个 if
永远不会被执行,因为 tempStr == baseStr == ''
总是成立。
正如评论者指出的,在实际代码中,tempStr
和 baseStr
确实会变化,并且 function
预计是一个哈希函数(但任何接受字符串作为参数的函数都应该可以用)。