📄 synhashset.h
字号:
#pragma once
#include "SynContainer.h"
#include <hash_set>
#include <atlstr.h>
#include "Md5.h"
template<class _ItemT>
class CSynHashSet : public CSynContainer<_ItemT,std::hash_set<_ItemT> >
{
};
/*
sunwang,2007.3.3,插入100万条记录,然后再插入100万条,查找100万条,删除所有记录,下面是
时间表,可见hash函数的好坏直接决定了hash_set和rb-tree的效率的差距。md5xor下hash_set比
rb-tree好!
0-100w-200w
metrix:ms
action hmd5xor rb-tree hHFIP hELF hHP
init 35515 57906 234328 584093 infinite
insert 41875 61578
find 16468 36703
erase 73985 112343
*/
#define _HASH_HFIP_ 0
#define _HASH_ELF_ 0
#define _HASH_HP_ 0
#define _HASH_MD5XOR_ 1
inline unsigned int hash_string(const char* url)
{
#if _HASH_HFIP_
//hfip
unsigned int n=0;
char* b=(char*)&n;
for (int i=0; i< (int)f_strlen(url); i++)
b[i%4]^=url[i];
return n;
#endif
#if _HASH_ELF_
//elf
unsigned int h=0;
while (*url)
{
h=(h<<4) + *url++;
unsigned int g= h & 0xF0000000;
if (g)
h^=g>>24;
h&=~g;
}
return h;
#endif
#if _HASH_HP_
//hp
size_t _Val = 0xdeadbeef;
size_t _Size = f_strlen(url);
if (0 < _Size)
{ // add one or more elements
size_t _Stride = (_Size / 16) + 1;
_Size -= _Stride; // protect against _Size near _Str.max_size()
for(size_t _Idx = 0; _Idx <= _Size; _Idx += _Stride)
_Val += (size_t)url[_Idx];
}
return (_Val);
#endif
#if _HASH_MD5XOR_
//md5xor
CMD5 md5;
md5.GenerateMD5((unsigned char*)url,f_strlen(url));
return md5.m_data[0]^md5.m_data[1]^md5.m_data[2]^md5.m_data[3];
#endif
}
//模板函数特化
template<> inline size_t stdext::hash_value(const CString& key)
{
return hash_string(key);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -