# Initialisation
# 32 first bits of generator polynomial for CRC64
# the 32 lower bits are assumed to be zero
POLY64REVh = 0xd8000000L
CRCTableh = [0] * 256
CRCTablel = [0] * 256
isInitialized = False
def CRC64(aString):
global isInitialized
crcl = 0
crch = 0
if (isInitialized is not True):
isInitialized = True
for i in xrange(256):
partl = i
parth = 0L
for j in xrange(8):
rflag = partl & 1L
partl >>= 1L
if (parth & 1):
partl |= (1L << 31L)
parth >>= 1L
if rflag:
parth ^= POLY64REVh
CRCTableh[i] = parth;
CRCTablel[i] = partl;
for item in aString:
shr = 0L
shr = (crch & 0xFF) << 24
temp1h = crch >> 8L
temp1l = (crcl >> 8L) | shr
tableindex = (crcl ^ ord(item)) & 0xFF
crch = temp1h ^ CRCTableh[tableindex]
crcl = temp1l ^ CRCTablel[tableindex]
return (crch, crcl)
def CRC64digest(aString):
return "%08X%08X" % (CRC64(aString))
if __name__ == '__main__':
assert CRC64("IHATEMATH") == (3822890454, 2600578513)
assert CRC64digest("IHATEMATH") == "E3DCADD69B01ADD1"
print 'CRC64: dumb test successful'