I've confirmed that the integer size issues are the reason for the hash target failure on 64-bit platforms. Initial testing of a SpamProbe package I compiled seems to indicate that making these the appropriate types fixes the issue.
I've attached a suggested patch. It uses stdint.h to get portable 32-bit wide integer types so it should be platform independent. Compiles fine under gcc and although stdint.h is C99, it also appear to be POSIX mandated and I guess it should compile fine under non-gcc compilers as well without needing any C99 related flags. Francis
diff -Nur spamprobe-1.4d/src/database/WordArray.h spamprobe-1.4d.new/src/database/WordArray.h --- spamprobe-1.4d/src/database/WordArray.h 2006-11-17 07:24:48.000000000 +0000 +++ spamprobe-1.4d.new/src/database/WordArray.h 2010-01-10 22:28:02.254603603 +0000 @@ -31,6 +31,8 @@ #ifndef _WordArray_h #define _WordArray_h +#include <stdint.h> + class WordData; class WordArray @@ -47,7 +49,7 @@ FLAGS_SIZE = 2, }; - typedef unsigned long key_t; + typedef uint32_t key_t; void reset(char *buffer, int num_words); diff -Nur spamprobe-1.4d/src/includes/hash.h spamprobe-1.4d.new/src/includes/hash.h --- spamprobe-1.4d/src/includes/hash.h 2006-11-17 07:14:30.000000000 +0000 +++ spamprobe-1.4d.new/src/includes/hash.h 2010-01-10 22:29:00.482854758 +0000 @@ -10,11 +10,13 @@ #ifndef _jenkinshash_h #define _jenkinshash_h +#include <stdint.h> + #ifdef __cplusplus extern "C" { #endif -typedef unsigned long int ub4; /* unsigned 4-byte quantities */ +typedef uint32_t ub4; /* unsigned 4-byte quantities */ typedef unsigned char ub1; /* unsigned 1-byte quantities */ #define hashsize(n) ((ub4)1<<(n))