Simple CRC64 Routine
Posted: Mon Aug 15, 2011 1:12 pm
For anyone that would like to use CRC64. It's not optimized so not as fast as it could be. Borrowed SHR64 from netmaestro's thread (think it's Danilo's function so thanks).
Ascii mode compile.
Ascii mode compile.
Code: Select all
Procedure.q SHR64(val.q, n)
If val & (1<<63) ; sign bit is set, normal shift will fail
val &~ (1<<63) ; clear the sign bit
val>>n ; shift will work normally now
val | 1<<(63-n) ; set the original sign bit at its new place
Else
val>>n ; nothing needed
EndIf
ProcedureReturn val
EndProcedure
Macro CRC64TableFill()
Dim CRC64Table.q(255)
CRC64Table(0) =$0000000000000000:CRC64Table(1) =$1B00000000000000:CRC64Table(2) =$3600000000000000:CRC64Table(3) =$2D00000000000000
CRC64Table(4) =$6C00000000000000:CRC64Table(5) =$7700000000000000:CRC64Table(6) =$5A00000000000000:CRC64Table(7) =$4100000000000000
CRC64Table(8) =$D800000000000000:CRC64Table(9) =$C300000000000000:CRC64Table(10) =$EE00000000000000:CRC64Table(11) =$F500000000000000
CRC64Table(12) =$B400000000000000:CRC64Table(13) =$AF00000000000000:CRC64Table(14) =$8200000000000000:CRC64Table(15) =$9900000000000000
CRC64Table(16) =$1B00000000000000:CRC64Table(17) =$1AB0000000000000:CRC64Table(18) =$1860000000000000:CRC64Table(19) =$19D0000000000000
CRC64Table(20) =$1DC0000000000000:CRC64Table(21) =$1C70000000000000:CRC64Table(22) =$1EA0000000000000:CRC64Table(23) =$1F10000000000000
CRC64Table(24) =$1680000000000000:CRC64Table(25) =$1730000000000000:CRC64Table(26) =$15E0000000000000:CRC64Table(27) =$1450000000000000
CRC64Table(28) =$1040000000000000:CRC64Table(29) =$11F0000000000000:CRC64Table(30) =$1320000000000000:CRC64Table(31) =$1290000000000000
CRC64Table(32) =$3600000000000000:CRC64Table(33) =$37B0000000000000:CRC64Table(34) =$3560000000000000:CRC64Table(35) =$34D0000000000000
CRC64Table(36) =$30C0000000000000:CRC64Table(37) =$3170000000000000:CRC64Table(38) =$33A0000000000000:CRC64Table(39) =$3210000000000000
CRC64Table(40) =$3B80000000000000:CRC64Table(41) =$3A30000000000000:CRC64Table(42) =$38E0000000000000:CRC64Table(43) =$3950000000000000
CRC64Table(44) =$3D40000000000000:CRC64Table(45) =$3CF0000000000000:CRC64Table(46) =$3E20000000000000:CRC64Table(47) =$3F90000000000000
CRC64Table(48) =$2D00000000000000:CRC64Table(49) =$2CB0000000000000:CRC64Table(50) =$2E60000000000000:CRC64Table(51) =$2FD0000000000000
CRC64Table(52) =$2BC0000000000000:CRC64Table(53) =$2A70000000000000:CRC64Table(54) =$28A0000000000000:CRC64Table(55) =$2910000000000000
CRC64Table(56) =$2080000000000000:CRC64Table(57) =$2130000000000000:CRC64Table(58) =$23E0000000000000:CRC64Table(59) =$2250000000000000
CRC64Table(60) =$2640000000000000:CRC64Table(61) =$27F0000000000000:CRC64Table(62) =$2520000000000000:CRC64Table(63) =$2490000000000000
CRC64Table(64) =$6C00000000000000:CRC64Table(65) =$6DB0000000000000:CRC64Table(66) =$6F60000000000000:CRC64Table(67) =$6ED0000000000000
CRC64Table(68) =$6AC0000000000000:CRC64Table(69) =$6B70000000000000:CRC64Table(70) =$69A0000000000000:CRC64Table(71) =$6810000000000000
CRC64Table(72) =$6180000000000000:CRC64Table(73) =$6030000000000000:CRC64Table(74) =$62E0000000000000:CRC64Table(75) =$6350000000000000
CRC64Table(76) =$6740000000000000:CRC64Table(77) =$66F0000000000000:CRC64Table(78) =$6420000000000000:CRC64Table(79) =$6590000000000000
CRC64Table(80) =$7700000000000000:CRC64Table(81) =$76B0000000000000:CRC64Table(82) =$7460000000000000:CRC64Table(83) =$75D0000000000000
CRC64Table(84) =$71C0000000000000:CRC64Table(85) =$7070000000000000:CRC64Table(86) =$72A0000000000000:CRC64Table(87) =$7310000000000000
CRC64Table(88) =$7A80000000000000:CRC64Table(89) =$7B30000000000000:CRC64Table(90) =$79E0000000000000:CRC64Table(91) =$7850000000000000
CRC64Table(92) =$7C40000000000000:CRC64Table(93) =$7DF0000000000000:CRC64Table(94) =$7F20000000000000:CRC64Table(95) =$7E90000000000000
CRC64Table(96) =$5A00000000000000:CRC64Table(97) =$5BB0000000000000:CRC64Table(98) =$5960000000000000:CRC64Table(99) =$58D0000000000000
CRC64Table(100)=$5CC0000000000000:CRC64Table(101)=$5D70000000000000:CRC64Table(102)=$5FA0000000000000:CRC64Table(103)=$5E10000000000000
CRC64Table(104)=$5780000000000000:CRC64Table(105)=$5630000000000000:CRC64Table(106)=$54E0000000000000:CRC64Table(107)=$5550000000000000
CRC64Table(108)=$5140000000000000:CRC64Table(109)=$50F0000000000000:CRC64Table(110)=$5220000000000000:CRC64Table(111)=$5390000000000000
CRC64Table(112)=$4100000000000000:CRC64Table(113)=$40B0000000000000:CRC64Table(114)=$4260000000000000:CRC64Table(115)=$43D0000000000000
CRC64Table(116)=$47C0000000000000:CRC64Table(117)=$4670000000000000:CRC64Table(118)=$44A0000000000000:CRC64Table(119)=$4510000000000000
CRC64Table(120)=$4C80000000000000:CRC64Table(121)=$4D30000000000000:CRC64Table(122)=$4FE0000000000000:CRC64Table(123)=$4E50000000000000
CRC64Table(124)=$4A40000000000000:CRC64Table(125)=$4BF0000000000000:CRC64Table(126)=$4920000000000000:CRC64Table(127)=$4890000000000000
CRC64Table(128)=$D800000000000000:CRC64Table(129)=$D9B0000000000000:CRC64Table(130)=$DB60000000000000:CRC64Table(131)=$DAD0000000000000
CRC64Table(132)=$DEC0000000000000:CRC64Table(133)=$DF70000000000000:CRC64Table(134)=$DDA0000000000000:CRC64Table(135)=$DC10000000000000
CRC64Table(136)=$D580000000000000:CRC64Table(137)=$D430000000000000:CRC64Table(138)=$D6E0000000000000:CRC64Table(139)=$D750000000000000
CRC64Table(140)=$D340000000000000:CRC64Table(141)=$D2F0000000000000:CRC64Table(142)=$D020000000000000:CRC64Table(143)=$D190000000000000
CRC64Table(144)=$C300000000000000:CRC64Table(145)=$C2B0000000000000:CRC64Table(146)=$C060000000000000:CRC64Table(147)=$C1D0000000000000
CRC64Table(148)=$C5C0000000000000:CRC64Table(149)=$C470000000000000:CRC64Table(150)=$C6A0000000000000:CRC64Table(151)=$C710000000000000
CRC64Table(152)=$CE80000000000000:CRC64Table(153)=$CF30000000000000:CRC64Table(154)=$CDE0000000000000:CRC64Table(155)=$CC50000000000000
CRC64Table(156)=$C840000000000000:CRC64Table(157)=$C9F0000000000000:CRC64Table(158)=$CB20000000000000:CRC64Table(159)=$CA90000000000000
CRC64Table(160)=$EE00000000000000:CRC64Table(161)=$EFB0000000000000:CRC64Table(162)=$ED60000000000000:CRC64Table(163)=$ECD0000000000000
CRC64Table(164)=$E8C0000000000000:CRC64Table(165)=$E970000000000000:CRC64Table(166)=$EBA0000000000000:CRC64Table(167)=$EA10000000000000
CRC64Table(168)=$E380000000000000:CRC64Table(169)=$E230000000000000:CRC64Table(170)=$E0E0000000000000:CRC64Table(171)=$E150000000000000
CRC64Table(172)=$E540000000000000:CRC64Table(173)=$E4F0000000000000:CRC64Table(174)=$E620000000000000:CRC64Table(175)=$E790000000000000
CRC64Table(176)=$F500000000000000:CRC64Table(177)=$F4B0000000000000:CRC64Table(178)=$F660000000000000:CRC64Table(179)=$F7D0000000000000
CRC64Table(180)=$F3C0000000000000:CRC64Table(181)=$F270000000000000:CRC64Table(182)=$F0A0000000000000:CRC64Table(183)=$F110000000000000
CRC64Table(184)=$F880000000000000:CRC64Table(185)=$F930000000000000:CRC64Table(186)=$FBE0000000000000:CRC64Table(187)=$FA50000000000000
CRC64Table(188)=$FE40000000000000:CRC64Table(189)=$FFF0000000000000:CRC64Table(190)=$FD20000000000000:CRC64Table(191)=$FC90000000000000
CRC64Table(192)=$B400000000000000:CRC64Table(193)=$B5B0000000000000:CRC64Table(194)=$B760000000000000:CRC64Table(195)=$B6D0000000000000
CRC64Table(196)=$B2C0000000000000:CRC64Table(197)=$B370000000000000:CRC64Table(198)=$B1A0000000000000:CRC64Table(199)=$B010000000000000
CRC64Table(200)=$B980000000000000:CRC64Table(201)=$B830000000000000:CRC64Table(202)=$BAE0000000000000:CRC64Table(203)=$BB50000000000000
CRC64Table(204)=$BF40000000000000:CRC64Table(205)=$BEF0000000000000:CRC64Table(206)=$BC20000000000000:CRC64Table(207)=$BD90000000000000
CRC64Table(208)=$AF00000000000000:CRC64Table(209)=$AEB0000000000000:CRC64Table(210)=$AC60000000000000:CRC64Table(211)=$ADD0000000000000
CRC64Table(212)=$A9C0000000000000:CRC64Table(213)=$A870000000000000:CRC64Table(214)=$AAA0000000000000:CRC64Table(215)=$AB10000000000000
CRC64Table(216)=$A280000000000000:CRC64Table(217)=$A330000000000000:CRC64Table(218)=$A1E0000000000000:CRC64Table(219)=$A050000000000000
CRC64Table(220)=$A440000000000000:CRC64Table(221)=$A5F0000000000000:CRC64Table(222)=$A720000000000000:CRC64Table(223)=$A690000000000000
CRC64Table(224)=$8200000000000000:CRC64Table(225)=$83B0000000000000:CRC64Table(226)=$8160000000000000:CRC64Table(227)=$80D0000000000000
CRC64Table(228)=$84C0000000000000:CRC64Table(229)=$8570000000000000:CRC64Table(230)=$87A0000000000000:CRC64Table(231)=$8610000000000000
CRC64Table(232)=$8F80000000000000:CRC64Table(233)=$8E30000000000000:CRC64Table(234)=$8CE0000000000000:CRC64Table(235)=$8D50000000000000
CRC64Table(236)=$8940000000000000:CRC64Table(237)=$88F0000000000000:CRC64Table(238)=$8A20000000000000:CRC64Table(239)=$8B90000000000000
CRC64Table(240)=$9900000000000000:CRC64Table(241)=$98B0000000000000:CRC64Table(242)=$9A60000000000000:CRC64Table(243)=$9BD0000000000000
CRC64Table(244)=$9FC0000000000000:CRC64Table(245)=$9E70000000000000:CRC64Table(246)=$9CA0000000000000:CRC64Table(247)=$9D10000000000000
CRC64Table(248)=$9480000000000000:CRC64Table(249)=$9530000000000000:CRC64Table(250)=$97E0000000000000:CRC64Table(251)=$9650000000000000
CRC64Table(252)=$9240000000000000:CRC64Table(253)=$93F0000000000000:CRC64Table(254)=$9120000000000000:CRC64Table(255)=$9090000000000000
EndMacro
Macro CRC64StringFingerprint(text)
CRC64Fingerprint(@text,StringByteLength(text))
EndMacro
Macro CRC32StringFingerprint(text)
CRC32Fingerprint(@text,StringByteLength(text))
EndMacro
Procedure.q CRC64Fingerprint(*Buffer, Size.l, InitialValue.q=0)
Protected CRC64TableFill()
Protected.q crc64=InitialValue, i.l, byte.a, index.a
For i=1 To Size
byte=PeekB(*Buffer+(i-1))
index = ((crc64 ! byte) & $FF);
crc64 = CRC64Table(index) ! SHR64(crc64,8);
Next
ProcedureReturn crc64;
EndProcedure
string.s = "123456789"; // CRC64 = 46A5A9388A5BEFFE
length=StringByteLength(string)
;1 step calculation
hash0.q=CRC64Fingerprint(@string, length)
;2 step calculation
part1.q=CRC64Fingerprint(@string,length/2)
hash1.q=CRC64Fingerprint(@string+length/2, length/2+1, part1)
Debug Hex(hash0,#PB_Quad)
Debug Hex(hash1,#PB_Quad)