我正在查看我在网上找到的一段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)
生成的输出类型
然后?非常感谢你们!
答案 0 :(得分:3)
显然,您可以将任何可调用对象function
传递给_computeCollisionChars
。然后初始化baseHash
作为调用function
并将空字符串作为参数的结果。在循环内部,条件为:如果使用空字符串调用的function
的结果作为参数等于baseHash
,则执行此操作。这是毫无意义的,因为tempStr
总是''
而baseHash
永远不会改变(或者你没有发布那部分)。
在当前代码段中,永远不会达到第二个if
,因为tempStr == baseStr == ''
总是如此。
正如评论员指出的那样,在实际代码中tempStr
和baseStr
确实发生了变化,function
应该是一个散列函数(但任何其他函数都需要一个字符串因为论证应该有效。)
答案 1 :(得分:1)
在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