[Back to CRC SWAG index] [Back to Main SWAG index] [Original]
{
SEAN PALMER
>> (more than I thought I would have). There were 190 collisions
>> out of 572 names.
>The solution would be to use a better hashing algorythm, simply
>adding up the ascii characters is not unique enough. You best
>approach would be to generate a CRC value for your hashing table
>rather then the checksum approach.
Or try this xorsum method (my own invention, have to plug for it... 8)
Lots faster than a crc with no table, with similar results.
NOT compatible with a crc.
This xorsum algorithm is hereby standardized and if anyone wants to use
it you should make sure your xorsum routines give the same results.
}
function XorSum16(var data; size : word; prevSum : word) : word; assembler;
asm
push ds
lds si, data
mov cx, size
mov bx, prevSum
mov dx, $ABCD
cld
jcxz @X
@L:
lodsb
rol bx, 1
xor bx, dx
xor bl, al
loop @L
@X:
mov ax, bx
pop ds
end;
{ to use on a string, for instance: }
const
s : string = 'this is a test';
begin
writeln(xorsum16(s, length(s) + 1, 0));
end.
{
send 0 as prevSum if you're not accumulating a result...otherwise send
the result from the previous buffer.
}
[Back to CRC SWAG index] [Back to Main SWAG index] [Original]