Un code de "moogle" sur le forum anglais que j'ai retravaillé un peu. Comme le titre le mentionne ce code permet de calculer l'empreinte CRC64 d'une zone mémoire. Le fonctionnement est identique à celui de la commande CRC32Fingerprint() native (Voir la section Cipher dans l'aide)
Édition : V1.2.0 simplification suggéré par wilbert sur le forum anglais.
A+
Guimauve
Code : Tout sélectionner
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Project name : CRC64Fingerprint
; File Name : CRC64Fingerprint.pb
; File version: 1.2.0
; Programming : OK
; Programmed by : moogle (English forum)
; Modified by : Guimauve, wilbert
; Date : 15-08-2011
; Last Update : 20-02-2012
; PureBasic code : 4.61
; Platform : Windows, Linux, MacOS X
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
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
Structure CRC64Table
Element.w[256]
EndStructure
Macro CRC64StringFingerprint(text)
CRC64Fingerprint(@text, StringByteLength(text))
EndMacro
Macro CRC32StringFingerprint(text)
CRC32Fingerprint(@text, StringByteLength(text))
EndMacro
Procedure.q CRC64Fingerprint(*Buffer.Ascii, Size.l, InitialValue.q = 0)
*CRC64Table.CRC64Table = ?crc64iso_short
CRC64_Fingerprint.q = InitialValue
For i = 1 To Size
Index.a = CRC64_Fingerprint ! *Buffer\a
CRC64_Fingerprint = (*CRC64Table\Element[Index] << 48) ! SHR64(CRC64_Fingerprint, 8)
*Buffer + 1
Next
ProcedureReturn CRC64_Fingerprint
DataSection
crc64iso_short:
Data.q $2D0036001B000000,$41005A0077006C00,$F500EE00C300D800,$99008200AF00B400
Data.q $19D018601AB01B00,$1F101EA01C701DC0,$145015E017301680,$1290132011F01040
Data.q $34D0356037B03600,$321033A0317030C0,$395038E03A303B80,$3F903E203CF03D40
Data.q $2FD02E602CB02D00,$291028A02A702BC0,$225023E021302080,$2490252027F02640
Data.q $6ED06F606DB06C00,$681069A06B706AC0,$635062E060306180,$6590642066F06740
Data.q $75D0746076B07700,$731072A0707071C0,$785079E07B307A80,$7E907F207DF07C40
Data.q $58D059605BB05A00,$5E105FA05D705CC0,$555054E056305780,$5390522050F05140
Data.q $43D0426040B04100,$451044A0467047C0,$4E504FE04D304C80,$489049204BF04A40
Data.q $DAD0DB60D9B0D800,$DC10DDA0DF70DEC0,$D750D6E0D430D580,$D190D020D2F0D340
Data.q $C1D0C060C2B0C300,$C710C6A0C470C5C0,$CC50CDE0CF30CE80,$CA90CB20C9F0C840
Data.q $ECD0ED60EFB0EE00,$EA10EBA0E970E8C0,$E150E0E0E230E380,$E790E620E4F0E540
Data.q $F7D0F660F4B0F500,$F110F0A0F270F3C0,$FA50FBE0F930F880,$FC90FD20FFF0FE40
Data.q $B6D0B760B5B0B400,$B010B1A0B370B2C0,$BB50BAE0B830B980,$BD90BC20BEF0BF40
Data.q $ADD0AC60AEB0AF00,$AB10AAA0A870A9C0,$A050A1E0A330A280,$A690A720A5F0A440
Data.q $80D0816083B08200,$861087A0857084C0,$8D508CE08E308F80,$8B908A2088F08940
Data.q $9BD09A6098B09900,$9D109CA09E709FC0,$965097E095309480,$9090912093F09240
EndDataSection
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< !!! WARNING - YOU ARE NOW IN A TESTING ZONE - WARNING !!! <<<<<
; <<<<< !!! WARNING - THIS CODE SHOULD BE COMMENTED - WARNING !!! <<<<<
; <<<<< !!! WARNING - BEFORE THE FINAL COMPILATION. - WARNING !!! <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Macro NewLongVector(ElementCount)
AllocateMemory((ElementCount) * SizeOf(Long))
EndMacro
Macro DeleteLongVector(StartPtr)
If StartPtr <> #Null
FreeMemory(StartPtr)
EndIf
EndMacro
Macro LongVectorSize(StartPtr)
(MemorySize(StartPtr) / SizeOf(Long) - 1)
EndMacro
Macro ReachLongVectorElement(StartPtr, Index)
(StartPtr + (Index) * SizeOf(Long))
EndMacro
Macro PokeLongVectorElement(StartPtr, Index, Value)
PokeL(ReachLongVectorElement(StartPtr, Index), Value)
EndMacro
Macro PeekLongVectorElement(StartPtr, Index)
PeekL(ReachLongVectorElement(StartPtr, Index))
EndMacro
String.s = "123456789"
length = StringByteLength(String)
; 1 step calculation
hash0.q = CRC64StringFingerprint(String)
hash2.l = CRC32StringFingerprint(String)
; 2 step calculation
part1.q = CRC64Fingerprint(@string, length/2)
part3.l = CRC32Fingerprint(@string, length/2)
CompilerIf #PB_Compiler_Unicode
hash1.q = CRC64Fingerprint(@string + length/2, length/2, part1)
hash3.l = CRC32Fingerprint(@string + length/2, length/2, part3)
CompilerElse
hash1.q = CRC64Fingerprint(@string + length/2, length/2+1, part1)
hash3.l = CRC32Fingerprint(@string + length/2, length/2+1, part3)
CompilerEndIf
; Memory Block test
Vector.i = NewLongVector(25)
For Index = 0 To LongVectorSize(Vector)
PokeLongVectorElement(Vector, Index, Index * 2)
Next
hash4.q = CRC64Fingerprint(Vector, MemorySize(Vector))
hash5.l = CRC32Fingerprint(Vector, MemorySize(Vector))
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
CompilerIf #PB_Compiler_Unicode
Debug "; Compiler Mode Unicode"
CompilerElse
Debug "; Compiler Mode Ascii"
CompilerEndIf
Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Single step calculation"
Debug "; "
Debug "; CRC32(" + Chr(34) + "123456789" + Chr(34) + ") = " + Hex(hash2, #PB_Long)
Debug "; CRC64(" + Chr(34) + "123456789" + Chr(34) + ") = " + Hex(hash0, #PB_Quad)
Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Twin step calculation"
Debug "; "
Debug "; CRC32(" + Chr(34) + "123456789" + Chr(34) + ") = " + Hex(hash3, #PB_Long)
Debug "; CRC64(" + Chr(34) + "123456789" + Chr(34) + ") = " + Hex(hash1, #PB_Quad)
Debug ""
Debug "; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<"
Debug "; Test on memory block"
Debug "; "
Debug "; CRC32(Vector) = " + Hex(hash5, #PB_Long)
Debug "; CRC64(Vector) = " + Hex(hash4, #PB_Quad)
DeleteLongVector(Vector)
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Compiler Mode Ascii
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Single step calculation
;
; CRC32("123456789") = CBF43926
; CRC64("123456789") = 46A5A9388A5BEFFE
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Twin step calculation
;
; CRC32("123456789") = CBF43926
; CRC64("123456789") = 46A5A9388A5BEFFE
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Test on memory block
;
; CRC32(Vector) = 9F8B14FB
; CRC64(Vector) = 2454C5C00DC5820B
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Compiler Mode Unicode
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Single step calculation
;
; CRC32("123456789") = A290E877
; CRC64("123456789") = A1DE936964162F16
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Twin step calculation
;
; CRC32("123456789") = A290E877
; CRC64("123456789") = A1DE936964162F16
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Test on memory block
;
; CRC32(Vector) = 9F8B14FB
; CRC64(Vector) = 2454C5C00DC5820B
; <<<<<<<<<<<<<<<<<<<<<<<
; <<<<< END OF FILE <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<