MD5和CRC都是某种信息摘要算法。
MD5能够生成一段信息(可以很大如视频文件,也可以很小如密码)的信息摘要(126bits,16Bytes)。这个信息摘要相当于这段信息的数字签名,能够防止这段信息被篡改。
CRC生成的信息摘要长度4bytes,且对源信息的大小有限制(小于4GBytes)。
CRC (Cyclic Redundancy Check)循环冗余校验码
http://blog.csdn.net/liyuanbhu/article/details/7882789
CRC校验核心是指定一个除数,实现无借位的除法运算,并将余数作为校验码。所谓无借位的除法指的是正常的除法,但加减法采用模2运算(异或)。
MD5库下载地址http://download.csdn.net/detail/huang_yx005/9724535
/* Md5 number length */
#define SMART_MD5NUMBER_SIZE 16
// 计算从首地址为memory,大小为memorysize的一段信息的MD5值,结果存放在md5number中
static int calc_md5number(const char *memory, uint memorysize, uchar *md5number) {
if (NULL == memory || NULL == md5number || memorysize == 0)
return 0;
/* Do md5 purity versification */
MD5_CTX mdcontext;
MD5Init(&mdcontext);
MD5Update(&mdcontext, (uchar *)memory, memorysize);
MD5Final(&mdcontext);
memcpy(md5number, mdcontext.digest, SMART_MD5NUMBER_SIZE);
return 1;
}
// 比较两个md5值是否相等
static int equal_md5number(uchar *md51, uchar *md52) {
uint i = 0;
if (NULL == md51 || NULL == md52)
return 0;
while (i < SMART_MD5NUMBER_SIZE && md51[i] == md52[i])
i++;
return i == SMART_MD5NUMBER_SIZE;
}
// 另一个例子
int bytes;
unsigned char data[1024];
MD5_CTX tmp_mdContext;
MD5Init (&tmp_mdContext);
while ((bytes = fread (data, 1, 1024, fp_OutTmp)) != 0) // 从文件fp_OutTmp中读取1024字节数据到data中
{
MD5Update(&tmp_mdContext, data, bytes); // 更新MD5值
fwrite(data, sizeof(unsigned char), bytes, fp_Out); // 将data中数据写入fp_out
}
MD5Final (&tmp_mdContext);
// 写入校验码
fprintf(fp_Out, "md5\n");
fwrite(tmp_mdContext.digest, sizeof(unsigned char), 16, fp_Out);
// 写入版本号
fprintf(fp_Out, "ver\n");
fwrite(&version, sizeof(unsigned int), 1, fp_Out);