天真的尝试惨遭失败:
import hashlib
class fred(hashlib.sha256):
pass
-> TypeError: Error when calling the metaclass bases
cannot create 'builtin_function_or_method' instances
嗯,原来 hashlib.sha256 是一个可调用的,而不是一个类。尝试一些更有创意的东西也不起作用:
import hashlib
class fred(type(hashlib.sha256())):
pass
f = fred
-> TypeError: cannot create 'fred' instances
嗯...
那么,我该怎么做呢?
这是我真正想要实现的:
class shad_256(sha256):
"""Double SHA - sha256(sha256(data).digest())
Less susceptible to length extension attacks than sha256 alone."""
def digest(self):
return sha256(sha256.digest(self)).digest()
def hexdigest(self):
return sha256(sha256.digest(self)).hexdigest()
基本上我希望一切都通过,除非有人要求结果我想插入我自己的额外步骤。有没有一种巧妙的方法可以使用 __new__
或某种元类魔术来完成此操作?
我有一个解决方案,我很满意我发布的答案,但我真的很想看看是否有人能想到更好的方法。要么更简洁,可读性成本非常低,要么更快(特别是在调用 update
时),同时仍然具有一定的可读性。
更新:我进行了一些测试:
# test_sha._timehash takes three parameters, the hash object generator to use,
# the number of updates and the size of the updates.
# Built in hashlib.sha256
$ python2.7 -m timeit -n 100 -s 'import test_sha, hashlib' 'test_sha._timehash(hashlib.sha256, 20000, 512)'
100 loops, best of 3: 104 msec per loop
# My wrapper based approach (see my answer)
$ python2.7 -m timeit -n 100 -s 'import test_sha, hashlib' 'test_sha._timehash(test_sha.wrapper_shad_256, 20000, 512)'
100 loops, best of 3: 108 msec per loop
# Glen Maynard's getattr based approach
$ python2.7 -m timeit -n 100 -s 'import test_sha, hashlib' 'test_sha._timehash(test_sha.getattr_shad_256, 20000, 512)'
100 loops, best of 3: 103 msec per loop
创建一个新类,从对象派生,在 init 中创建一个 hashlib.sha256 成员变量,然后定义散列类所需的方法并代理到成员变量的相同方法。
类似于:
import hashlib
class MyThing(object):
def __init__(self):
self._hasher = hashlib.sha256()
def digest(self):
return self._hasher.digest()
其他方法依此类推。
我是一名优秀的程序员,十分优秀!