关于 16位和32位 md5得到的是一个16字节的散列值 每个字节用16进制(0x**)格式成两个字符,连起来得到一个32个字符的串这就是所说的32位。16位就是取的32位的中间段


md5(aabbccdd) 32位 = bf3b2290e229da2ba272a81c602ea88d

md5(aabbccdd) 16位 = e229da2ba272a81c


使用openssl的md5有两种方式


第一种 为非连缓的字符串准备的 多次调用MD5_Update最后通过MD5_Final得到最终的md5值

int MD5_Init(MD5_CTX *c);

int MD5_Update(MD5_CTX *c, const void *data, size_t len);

int MD5_Final(unsigned char *md, MD5_CTX *c);


第二种 直接得到结果 函数源代码里面其实也是直接调用的 MD5_Init MD5_Update MD5_Final

unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);



#include<openssl/md5.h>#include<stdio.h>#include<string>#include<string.h>intmain(){unsignedcharMD5result[16];std::stringsrc="aabbccddee";std::stringmd5="";std::stringmd5_16="";chartemp[33]={};MD5((constunsignedchar*)src.c_str(),src.size(),MD5result);for(inti=0;i<16;++i){snprintf(temp,10,"%02x",MD5result[i]);md5+=temp;if(i>=4&&i<=11)md5_16+=temp;}printf("src:%s\nmd532位:%s\nmd516位:%s\n",src.c_str(),md5.c_str(),md5_16.c_str());return0;}

g++ -g -o openssl_md5 openssl_md5.cpp -I/usr/include/openssl -lssl -lcrypto -L/usr/lib64