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)