odps/crc.py (118 lines of code) (raw):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright 1999-2024 Alibaba Group Holding Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import zlib
from .compat import six
from .config import options
class Crc32(object):
def __init__(self):
self.crc = None
def update(self, buf, off=None, length=None):
assert isinstance(buf, (six.binary_type, bytearray))
off = off or 0
length = length or len(buf)
to_crc = buf[off : off + length]
if isinstance(to_crc, bytearray):
to_crc = bytes(to_crc)
if self.crc:
self.crc = zlib.crc32(to_crc, self.crc)
else:
self.crc = zlib.crc32(to_crc)
def reset(self):
self.crc = None
def getvalue(self):
return self.crc
try:
if not options.force_py:
from .src.crc32c_c import Crc32c
else:
Crc32c = None
except ImportError as e:
if options.force_c:
raise e
Crc32c = None
if Crc32c is None:
# fmt: off
_CRC_TABLE = (
0X00000000, 0XF26B8303, 0XE13B70F7, 0X1350F3F4,
0XC79A971F, 0X35F1141C, 0X26A1E7E8, 0XD4CA64EB,
0X8AD958CF, 0X78B2DBCC, 0X6BE22838, 0X9989AB3B,
0X4D43CFD0, 0XBF284CD3, 0XAC78BF27, 0X5E133C24,
0X105EC76F, 0XE235446C, 0XF165B798, 0X030E349B,
0XD7C45070, 0X25AFD373, 0X36FF2087, 0XC494A384,
0X9A879FA0, 0X68EC1CA3, 0X7BBCEF57, 0X89D76C54,
0X5D1D08BF, 0XAF768BBC, 0XBC267848, 0X4E4DFB4B,
0X20BD8EDE, 0XD2D60DDD, 0XC186FE29, 0X33ED7D2A,
0XE72719C1, 0X154C9AC2, 0X061C6936, 0XF477EA35,
0XAA64D611, 0X580F5512, 0X4B5FA6E6, 0XB93425E5,
0X6DFE410E, 0X9F95C20D, 0X8CC531F9, 0X7EAEB2FA,
0X30E349B1, 0XC288CAB2, 0XD1D83946, 0X23B3BA45,
0XF779DEAE, 0X05125DAD, 0X1642AE59, 0XE4292D5A,
0XBA3A117E, 0X4851927D, 0X5B016189, 0XA96AE28A,
0X7DA08661, 0X8FCB0562, 0X9C9BF696, 0X6EF07595,
0X417B1DBC, 0XB3109EBF, 0XA0406D4B, 0X522BEE48,
0X86E18AA3, 0X748A09A0, 0X67DAFA54, 0X95B17957,
0XCBA24573, 0X39C9C670, 0X2A993584, 0XD8F2B687,
0X0C38D26C, 0XFE53516F, 0XED03A29B, 0X1F682198,
0X5125DAD3, 0XA34E59D0, 0XB01EAA24, 0X42752927,
0X96BF4DCC, 0X64D4CECF, 0X77843D3B, 0X85EFBE38,
0XDBFC821C, 0X2997011F, 0X3AC7F2EB, 0XC8AC71E8,
0X1C661503, 0XEE0D9600, 0XFD5D65F4, 0X0F36E6F7,
0X61C69362, 0X93AD1061, 0X80FDE395, 0X72966096,
0XA65C047D, 0X5437877E, 0X4767748A, 0XB50CF789,
0XEB1FCBAD, 0X197448AE, 0X0A24BB5A, 0XF84F3859,
0X2C855CB2, 0XDEEEDFB1, 0XCDBE2C45, 0X3FD5AF46,
0X7198540D, 0X83F3D70E, 0X90A324FA, 0X62C8A7F9,
0XB602C312, 0X44694011, 0X5739B3E5, 0XA55230E6,
0XFB410CC2, 0X092A8FC1, 0X1A7A7C35, 0XE811FF36,
0X3CDB9BDD, 0XCEB018DE, 0XDDE0EB2A, 0X2F8B6829,
0X82F63B78, 0X709DB87B, 0X63CD4B8F, 0X91A6C88C,
0X456CAC67, 0XB7072F64, 0XA457DC90, 0X563C5F93,
0X082F63B7, 0XFA44E0B4, 0XE9141340, 0X1B7F9043,
0XCFB5F4A8, 0X3DDE77AB, 0X2E8E845F, 0XDCE5075C,
0X92A8FC17, 0X60C37F14, 0X73938CE0, 0X81F80FE3,
0X55326B08, 0XA759E80B, 0XB4091BFF, 0X466298FC,
0X1871A4D8, 0XEA1A27DB, 0XF94AD42F, 0X0B21572C,
0XDFEB33C7, 0X2D80B0C4, 0X3ED04330, 0XCCBBC033,
0XA24BB5A6, 0X502036A5, 0X4370C551, 0XB11B4652,
0X65D122B9, 0X97BAA1BA, 0X84EA524E, 0X7681D14D,
0X2892ED69, 0XDAF96E6A, 0XC9A99D9E, 0X3BC21E9D,
0XEF087A76, 0X1D63F975, 0X0E330A81, 0XFC588982,
0XB21572C9, 0X407EF1CA, 0X532E023E, 0XA145813D,
0X758FE5D6, 0X87E466D5, 0X94B49521, 0X66DF1622,
0X38CC2A06, 0XCAA7A905, 0XD9F75AF1, 0X2B9CD9F2,
0XFF56BD19, 0X0D3D3E1A, 0X1E6DCDEE, 0XEC064EED,
0XC38D26C4, 0X31E6A5C7, 0X22B65633, 0XD0DDD530,
0X0417B1DB, 0XF67C32D8, 0XE52CC12C, 0X1747422F,
0X49547E0B, 0XBB3FFD08, 0XA86F0EFC, 0X5A048DFF,
0X8ECEE914, 0X7CA56A17, 0X6FF599E3, 0X9D9E1AE0,
0XD3D3E1AB, 0X21B862A8, 0X32E8915C, 0XC083125F,
0X144976B4, 0XE622F5B7, 0XF5720643, 0X07198540,
0X590AB964, 0XAB613A67, 0XB831C993, 0X4A5A4A90,
0X9E902E7B, 0X6CFBAD78, 0X7FAB5E8C, 0X8DC0DD8F,
0XE330A81A, 0X115B2B19, 0X020BD8ED, 0XF0605BEE,
0X24AA3F05, 0XD6C1BC06, 0XC5914FF2, 0X37FACCF1,
0X69E9F0D5, 0X9B8273D6, 0X88D28022, 0X7AB90321,
0XAE7367CA, 0X5C18E4C9, 0X4F48173D, 0XBD23943E,
0XF36E6F75, 0X0105EC76, 0X12551F82, 0XE03E9C81,
0X34F4F86A, 0XC69F7B69, 0XD5CF889D, 0X27A40B9E,
0X79B737BA, 0X8BDCB4B9, 0X988C474D, 0X6AE7C44E,
0XBE2DA0A5, 0X4C4623A6, 0X5F16D052, 0XAD7D5351,
)
# fmt: on
_CRC_INIT = 0xFFFFFFFF
class Crc32c(object):
_method = "py"
def __init__(self):
self.crc = _CRC_INIT
def update(self, buf, off=None, length=None):
"""
:param buf: buf to update
:type buf: bytearray
:param off: offset
:param length: length
"""
off = off or 0
length = length or len(buf)
to_crc = buf[off : off + length]
crc = self.crc
for b in to_crc:
table_index = (crc ^ b) & 0xFF
crc = (_CRC_TABLE[table_index] ^ (crc >> 8)) & 0xFFFFFFFF
self.crc = crc & 0xFFFFFFFF
def reset(self):
self.crc = _CRC_INIT
@classmethod
def _crc_finalize(cls, crc):
return crc ^ 0xFFFFFFFF
def getvalue(self):
return Crc32c._crc_finalize(self.crc)