ResumableSHA256
This commit is contained in:
parent
21262d2e43
commit
405cef8d28
1 changed files with 38 additions and 0 deletions
|
@ -7,12 +7,14 @@ import logging
|
||||||
import logging.handlers
|
import logging.handlers
|
||||||
import typing
|
import typing
|
||||||
import collections
|
import collections
|
||||||
|
from ctypes import cast, memmove, POINTER, c_void_p
|
||||||
from bisect import insort_right
|
from bisect import insort_right
|
||||||
from collections import deque
|
from collections import deque
|
||||||
from decimal import Decimal
|
from decimal import Decimal
|
||||||
from typing import Iterable, Deque
|
from typing import Iterable, Deque
|
||||||
from asyncio import get_event_loop, Event
|
from asyncio import get_event_loop, Event
|
||||||
from prometheus_client import Counter
|
from prometheus_client import Counter
|
||||||
|
from rehash.structs import EVPobject
|
||||||
from hub.schema.tags import clean_tags
|
from hub.schema.tags import clean_tags
|
||||||
from hub.schema.url import normalize_name
|
from hub.schema.url import normalize_name
|
||||||
from hub.error import TooManyClaimSearchParametersError
|
from hub.error import TooManyClaimSearchParametersError
|
||||||
|
@ -1059,3 +1061,39 @@ async def asyncify_for_loop(gen, ticks_per_sleep: int = 1000):
|
||||||
yield item
|
yield item
|
||||||
if cnt % ticks_per_sleep == 0:
|
if cnt % ticks_per_sleep == 0:
|
||||||
await async_sleep(0)
|
await async_sleep(0)
|
||||||
|
|
||||||
|
|
||||||
|
class ResumableSHA256:
|
||||||
|
__slots__ = ['_hasher']
|
||||||
|
|
||||||
|
def __init__(self, state: typing.Optional[bytes] = None):
|
||||||
|
self._hasher = hashlib.sha256()
|
||||||
|
if state is not None:
|
||||||
|
ctx = self._get_evp_md_ctx()
|
||||||
|
ctx_size = ctx.digest.contents.ctx_size
|
||||||
|
memmove(ctx.md_data, state, ctx_size)
|
||||||
|
|
||||||
|
def _get_evp_md_ctx(self):
|
||||||
|
c_evp_obj = cast(c_void_p(id(self._hasher)), POINTER(EVPobject))
|
||||||
|
if hasattr(c_evp_obj.contents.ctx, "contents"):
|
||||||
|
return c_evp_obj.contents.ctx.contents
|
||||||
|
else:
|
||||||
|
return c_evp_obj.contents.ctx
|
||||||
|
|
||||||
|
def get_state(self) -> bytes:
|
||||||
|
ctx = self._get_evp_md_ctx()
|
||||||
|
ctx_size = ctx.digest.contents.ctx_size
|
||||||
|
hasher_state = ctx.md_data[:ctx_size]
|
||||||
|
return hasher_state
|
||||||
|
|
||||||
|
def copy(self):
|
||||||
|
return ResumableSHA256(self.get_state())
|
||||||
|
|
||||||
|
def update(self, data: bytes):
|
||||||
|
self._hasher.update(data)
|
||||||
|
|
||||||
|
def digest(self):
|
||||||
|
return self._hasher.digest()
|
||||||
|
|
||||||
|
def hexdigest(self):
|
||||||
|
return self.digest().hex()
|
||||||
|
|
Loading…
Reference in a new issue