How about this (not perfect but better I think):
--------------------------
implementation
{$R *.DFM}
uses CRC32c;
function TForm1.HashIndex(Value: Pointer): Integer;
var Key: Integer;
vCRC32 : Cardinal;
ik, ix : Integer;
currentByte : Byte;
begin
// Seed the CRC calculation
vCRC32 := CRCSeed;
ik := Integer(Value) shr 6;
for ix := 1 to 4 do
begin
currentByte := ik MOD 256;
vCRC32 := CRC32(currentByte,vCRC32);
ik := ik DIV 256;
end {for};
vCRC32 := CRCEnd(vCRC32);
// Mod the value with the hash size
result := vCRC32 mod HASH_SIZE;
end;
--------------------------
where:
Unit CRC32c;
{ Modified from a version posted on the Pascal echo by Floor
A.C. Naaijkens (note introduction of a Constant and a
Function and making the Array a Constant outside of
crc32() which should improve speed a lot; further
references made to a C version in a File of Snippets from the
C Echo marked as "Copyright (C) 1986 Gary S. Brown" (mostly to
compare the large Arrays, which proved to be identical), and to
"File verification using CRC" by Mark R. Nelson in Dr. Dobbs'
Journal, May 1992. The latter provided the final piece of
crucial information. Use: 1) Create a LongInt Variable For the
CRC value; 2) Initialize this With CRCSeed; 3) Build the
CRC Byte-by-Byte With CRC32(); 4) Finish With CRCend()
(this was the part I found in Nelson). The result is a CRC
value identical to that calculated by PKZip and ARJ.
}
{
Now to use it...
With a LongInt Variable, say vCRC32, first seed it
vCRC32 := CRCSeed;
Then go Byte-by-Byte thorugh to calculate:
For P := 1 to Size DO
vCRC32 := CRC32(Bytes[P], vCRC32);
Then finish it off With CRCend
vCRC32 := CRCend(vCRC32);
You should be able to Write your own Dec2Hex Function =)
}
Interface
Const
CRCSeed = Cardinal($ffffffff);
CRC32tab : Array[0..255] of Cardinal = (
$00000000, $77073096, $ee0e612c, $990951ba, $076dc419, $706af48f,
$e963a535, $9e6495a3, $0edb8832, $79dcb8a4, $e0d5e91e, $97d2d988,
$09b64c2b, $7eb17cbd, $e7b82d07, $90bf1d91, $1db71064, $6ab020f2,
$f3b97148, $84be41de, $1adad47d, $6ddde4eb, $f4d4b551, $83d385c7,
$136c9856, $646ba8c0, $fd62f97a, $8a65c9ec, $14015c4f, $63066cd9,
$fa0f3d63, $8d080df5, $3b6e20c8, $4c69105e, $d56041e4, $a2677172,
$3c03e4d1, $4b04d447, $d20d85fd, $a50ab56b, $35b5a8fa, $42b2986c,
$dbbbc9d6, $acbcf940, $32d86ce3, $45df5c75, $dcd60dcf, $abd13d59,
$26d930ac, $51de003a, $c8d75180, $bfd06116, $21b4f4b5, $56b3c423,
$cfba9599, $b8bda50f, $2802b89e, $5f058808, $c60cd9b2, $b10be924,
$2f6f7c87, $58684c11, $c1611dab, $b6662d3d, $76dc4190, $01db7106,
$98d220bc, $efd5102a, $71b18589, $06b6b51f, $9fbfe4a5, $e8b8d433,
$7807c9a2, $0f00f934, $9609a88e, $e10e9818, $7f6a0dbb, $086d3d2d,
$91646c97, $e6635c01, $6b6b51f4, $1c6c6162, $856530d8, $f262004e,
$6c0695ed, $1b01a57b, $8208f4c1, $f50fc457, $65b0d9c6, $12b7e950,
$8bbeb8ea, $fcb9887c, $62dd1ddf, $15da2d49, $8cd37cf3, $fbd44c65,
$4db26158, $3ab551ce, $a3bc0074, $d4bb30e2, $4adfa541, $3dd895d7,
$a4d1c46d, $d3d6f4fb, $4369e96a, $346ed9fc, $ad678846, $da60b8d0,
$44042d73, $33031de5, $aa0a4c5f, $dd0d7cc9, $5005713c, $270241aa,
$be0b1010, $c90c2086, $5768b525, $206f85b3, $b966d409, $ce61e49f,
$5edef90e, $29d9c998, $b0d09822, $c7d7a8b4, $59b33d17, $2eb40d81,
$b7bd5c3b, $c0ba6cad, $edb88320, $9abfb3b6, $03b6e20c, $74b1d29a,
$ead54739, $9dd277af, $04db2615, $73dc1683, $e3630b12, $94643b84,
$0d6d6a3e, $7a6a5aa8, $e40ecf0b, $9309ff9d, $0a00ae27, $7d079eb1,
$f00f9344, $8708a3d2, $1e01f268, $6906c2fe, $f762575d, $806567cb,
$196c3671, $6e6b06e7, $fed41b76, $89d32be0, $10da7a5a, $67dd4acc,
$f9b9df6f, $8ebeeff9, $17b7be43, $60b08ed5, $d6d6a3e8, $a1d1937e,
$38d8c2c4, $4fdff252, $d1bb67f1, $a6bc5767, $3fb506dd, $48b2364b,
$d80d2bda, $af0a1b4c, $36034af6, $41047a60, $df60efc3, $a867df55,
$316e8eef, $4669be79, $cb61b38c, $bc66831a, $256fd2a0, $5268e236,
$cc0c7795, $bb0b4703, $220216b9, $5505262f, $c5ba3bbe, $b2bd0b28,
$2bb45a92, $5cb36a04, $c2d7ffa7, $b5d0cf31, $2cd99e8b, $5bdeae1d,
$9b64c2b0, $ec63f226, $756aa39c, $026d930a, $9c0906a9, $eb0e363f,
$72076785, $05005713, $95bf4a82, $e2b87a14, $7bb12bae, $0cb61b38,
$92d28e9b, $e5d5be0d, $7cdcefb7, $0bdbdf21, $86d3d2d4, $f1d4e242,
$68ddb3f8, $1fda836e, $81be16cd, $f6b9265b, $6fb077e1, $18b74777,
$88085ae6, $ff0f6a70, $66063bca, $11010b5c, $8f659eff, $f862ae69,
$616bffd3, $166ccf45, $a00ae278, $d70dd2ee, $4e048354, $3903b3c2,
$a7672661, $d06016f7, $4969474d, $3e6e77db, $aed16a4a, $d9d65adc,
$40df0b66, $37d83bf0, $a9bcae53, $debb9ec5, $47b2cf7f, $30b5ffe9,
$bdbdf21c, $cabac28a, $53b39330, $24b4a3a6, $bad03605, $cdd70693,
$54de5729, $23d967bf, $b3667a2e, $c4614ab8, $5d681b02, $2a6f2b94,
$b40bbe37, $c30c8ea1, $5a05df1b, $2d02ef8d );
Function CRC32(value: Byte; crc: Cardinal) : Cardinal;
Function CRCend( crc : Cardinal ) : Cardinal ;
Implementation
Function CRC32(value: Byte; crc: Cardinal) : Cardinal;
begin
Result := CRC32tab[Byte(crc xor Cardinal(value))] xor
((crc shr 8) and $00ffffff);
end;
Function CRCend( crc : Cardinal ): Cardinal;
begin
CRCend := (crc xor CRCSeed);
end;
end.
Main Topics
Browse All Topics





by: kretzschmarPosted on 2004-02-16 at 10:50:22ID: 10374530
listening . . .