00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "footprint.h"
00010
00011 #include <sys/types.h>
00012 #include <string.h>
00013 #include <assert.h>
00014
00015 static const u_int32_t crctab[] = {
00016 0x0,
00017 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,
00018 0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6,
00019 0x2b4bcb61, 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
00020 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9, 0x5f15adac,
00021 0x5bd4b01b, 0x569796c2, 0x52568b75, 0x6a1936c8, 0x6ed82b7f,
00022 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3, 0x709f7b7a,
00023 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
00024 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58,
00025 0xbaea46ef, 0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033,
00026 0xa4ad16ea, 0xa06c0b5d, 0xd4326d90, 0xd0f37027, 0xddb056fe,
00027 0xd9714b49, 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
00028 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1, 0xe13ef6f4,
00029 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,
00030 0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5,
00031 0x2ac12072, 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
00032 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca, 0x7897ab07,
00033 0x7c56b6b0, 0x71159069, 0x75d48dde, 0x6b93dddb, 0x6f52c06c,
00034 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1,
00035 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
00036 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b,
00037 0xbb60adfc, 0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698,
00038 0x832f1041, 0x87ee0df6, 0x99a95df3, 0x9d684044, 0x902b669d,
00039 0x94ea7b2a, 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
00040 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2, 0xc6bcf05f,
00041 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,
00042 0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80,
00043 0x644fc637, 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
00044 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f, 0x5c007b8a,
00045 0x58c1663d, 0x558240e4, 0x51435d53, 0x251d3b9e, 0x21dc2629,
00046 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5, 0x3f9b762c,
00047 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
00048 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e,
00049 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65,
00050 0xeba91bbc, 0xef68060b, 0xd727bbb6, 0xd3e6a601, 0xdea580d8,
00051 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
00052 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7, 0xae3afba2,
00053 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,
00054 0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74,
00055 0x857130c3, 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
00056 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c, 0x7b827d21,
00057 0x7f436096, 0x7200464f, 0x76c15bf8, 0x68860bfd, 0x6c47164a,
00058 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e, 0x18197087,
00059 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
00060 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d,
00061 0x2056cd3a, 0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce,
00062 0xcc2b1d17, 0xc8ea00a0, 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb,
00063 0xdbee767c, 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
00064 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4, 0x89b8fd09,
00065 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,
00066 0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf,
00067 0xa2f33668, 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
00068 };
00069
00070 #define COMPUTE(var, ch) (var) = (var) << 8 ^ crctab[(var) >> 24 ^ (ch)]
00071
00073 long crc(char* s)
00074 {
00075 u_int32_t scrc=~0;
00076 while(*s) COMPUTE(scrc,*(s++));
00077 return scrc;
00078 }
00079
00081 long crc(char *s, int len)
00082 {
00083 u_int32_t scrc=~0;
00084 while(len--) COMPUTE(scrc,*(s++));
00085 return scrc;
00086 }
00087
00089 void cksumblock(FILE* file, u_int32_t& crc)
00090 {
00091 char buf[512]; memset(buf,0,sizeof(char)*512);
00092 fread(buf, sizeof(char), 512, file);
00093 for (int i=0; i<512; ++i) COMPUTE(crc, buf[i]);
00094 }
00095
00096 static char basis_64[] =
00097 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
00098
00100 char* encode(u_int32_t v)
00101 {
00102 int i;
00103 char* cod = new char[7];
00104 for( i=0; i<6; ++i) {
00105 cod[i]=basis_64[v%64];
00106 v = v/64;
00107 }
00108 cod[i]=0;
00109 return cod;
00110 }
00111
00118
00119 char* footprint(FILE* file)
00120 {
00121 int i;
00122 char* res = new char[128];
00123 u_int32_t crca=~0;
00124 fseek(file, 0, SEEK_SET);
00125 cksumblock(file,crca); cksumblock(file,crca); cksumblock(file,crca);
00126 cksumblock(file,crca); cksumblock(file,crca);
00127 fseek(file, 0, SEEK_END); long flen=ftell(file);
00128 if (0 == (flen%512) ) fseek(file, -5*512, SEEK_END);
00129 else fseek(file, -(flen%512)-4*512, SEEK_END);
00130 u_int32_t crce=~0;
00131 cksumblock(file,crce); cksumblock(file,crce); cksumblock(file,crce);
00132 cksumblock(file,crce); cksumblock(file,crce);
00133 long fblocks=flen/512;
00134 long skip=fblocks/16;
00135 long crcblock=skip;
00136 u_int32_t crc1=~0,crc2=~0,crc3=~0;
00137 for (i=0; i<5; ++i) {
00138 fseek(file, 512*crcblock, SEEK_SET);
00139 cksumblock(file,crc1);
00140 crcblock += skip;
00141 }
00142 for (i=0; i<5; ++i) {
00143 fseek(file, 512*crcblock, SEEK_SET);
00144 cksumblock(file,crc2);
00145 crcblock += skip;
00146 }
00147 for (i=0; i<5; ++i) {
00148 fseek(file, 512*crcblock, SEEK_SET);
00149 cksumblock(file,crc3);
00150 crcblock += skip;
00151 }
00152 snprintf(res,128,"*%s%s%s%s%s*",encode(crca),encode(crc1),
00153 encode(crc2),encode(crc3),encode(crce));
00154 return res;
00155 }
00156
00158 double footPrintDiff(const char* f1, const char* f2)
00159 {
00160 int count=0;
00161 int equalchars=0;
00162 while (*f1) {
00163 assert(*f2);
00164 if (*f1 == *f2) ++equalchars;
00165 ++count;
00166 ++f1;
00167 ++f2;
00168 }
00169 return 1-double(equalchars)/count;
00170 }
00171