gpt4 book ai didi

python - 我如何从 Python 中的 hashlib.sha256 派生?

转载 作者:太空宇宙 更新时间:2023-11-03 12:22:30 24 4
gpt4 key购买 nike

天真的尝试惨遭失败:

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()

其他方法依此类推。

关于python - 我如何从 Python 中的 hashlib.sha256 派生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4029632/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com