Page 1 sur 1

CRC 64 Fingerprint

Publié : lun. 20/févr./2012 21:03
par Guimauve
Bonjour à tous,

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 <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<