本文主要是介绍md5值 作为mapstring,time_t键值,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在后台 服务器处理客户端发过来的数据时,由于通信网络传输 较差,实际收到了客户端的数据并进行了处理,给出了回应,但客户端由于网络原因判断为该条消息未发送成功,而重发。则服务器程序必须做出去重。
观察 实际解析到的消息结构体 如下
typedef struct
{time_t m_c_time,string m_localid,string m_buddyid,string m_msg,
}msg_info;
time 对多个msg_info实际并不唯一,所以 要根据 time_t m_c_time,
string m_localid, string m_buddyid,这三个参数生成一个md5值作为唯一的map索引(因为要求快速响应速度)
所以 将生成的md5值转化为string,作为map的key
将 time_t作为时间标记,作为 map的value
具体代码如下
static std::map<string,time_t> s_chat_indentity;string md5Index;char md5buf[33];bzero(md5buf,33);int nLen =0;for(int i =0;i< 16;i++){nLen += sprintf(md5buf+nLen,"%x",0xff&(md5Str[i]));// no "%02x"}
//实际生成的md5值以16进制打印出来的字符串 包含有0,所以不能用 "%02x",补齐md5Index = md5buf;time_t curtime;time(&curtime);std::map<string,time_t>::iterator it = s_chat_identify.find(md5Index);if(it != s_chat_identify.end()){s_chat_identify[md5Index]= curtime;//更新 md5 对应记录的最后一次出现的时间return false;}if(s_chat_identify.size() >= MAX_MAP_COUNT){for(map<string,time_t>::iterator it = s_chat_identify.begin();it!= s_chat_identify.end();){if(curtime - it->second > MAX_TIME_DIF){s_chat_identify.erase(it++);
//对map的时间值进行排序耗时太大,所以改 选择 找出 时间差超过限制的老记录删除之
//另外 map的迭代器删除和vector的顺序存储容器不一样}else{++it;}} }if(s_chat_identify.size() >= MAX_MAP_COUNT_LIMIT){s_chat_identify.erase(s_chat_identify.begin());//超过map的最大限,则选择删除 最开始的PRINT_LOG(__FILE__,__LINE__,ERROR_LEVEL,-1,"random del first record, map size is too larger : %d", s_chat_identify.size());}s_chat_identify.insert(pair<string, time_t>(md5Index, curtime));
这篇关于md5值 作为mapstring,time_t键值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!