⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 synhashset.h

📁 概述:数据的纵向收集
💻 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 + -