简单之特征检测缓存设计

    在开发中,很多人都在为效率,精确与安全方面做最大的平衡,但结果往往不如人意,没有完美的解决方案,只有针对性的对象与方法,不同的方向有不同的需要,过于追求完美最终受伤的还是自己。想做一个高效但精确度较低的简单特征检测设计,感觉到了利弊的矛盾,但凡是都值得一试!大笑


#define MAX_CHATIC_SIZE (256)

//单个缓存方案
typedef struct _BUNCH_CACHE {
	bool bOwn;
	bool bPUnit[MAX_CHATIC_SIZE];
} BUNCH_CACHE,*PBUNCH_CACHE;

typedef struct _CHARACTERISTIC_CACHE {
	bool bOwn;
	BUNCH_CACHE sBCache[MAX_CHATIC_SIZE];
} CHARACTERISTIC_CACHE, *PCHARACTERISTIC_CACHE;

//多个缓存方案
typedef struct _GROUP_CHARACTERISTIC_CACHE {
	CHARACTERISTIC_CACHE sCCache[MAX_CHATIC_SIZE];
} GROUP_CHARACTERISTIC_CACHE, *PGROUP_CHARACTERISTIC_CACHE;

/*
* 通过云计算统计出目前最流行的特征数据,特征数据最大长度为256个字节;
* 缓存支持65536个特征数据,虽然精确率较低但同时也有提高精确降低效率的方法;
*/


//初始化准备;
inline PCHARACTERISTIC_CACHE _cdecl ChaticCache_Init(void)
{
	PCHARACTERISTIC_CACHE lpChaticCache = (PCHARACTERISTIC_CACHE)malloc((sizeof(CHARACTERISTIC_CACHE) * MAX_CHATIC_SIZE));

	if (NULL == lpChaticCache)
		return NULL;

	memset(lpChaticCache, 0, (sizeof(CHARACTERISTIC_CACHE) * MAX_CHATIC_SIZE));

	return (lpChaticCache);
}

inline void _cdecl ChaticCache_Free(PCHARACTERISTIC_CACHE * lpChaticCache)
{
	if (*lpChaticCache != NULL)
	{
		free(*lpChaticCache);
		*lpChaticCache = NULL;
	}
}

enum _CHATIC_CACHE_RETURN {
	Error_Succeed,
	Error_Param,
	Error_Fail
};

//充填缓存特征数据;
inline int _cdecl ChaticCache_Fill(PCHARACTERISTIC_CACHE lpChaticCache, const UCHAR * lpFillData, size_t uCount)
{
	register USHORT uByteIndex = 0U;
	register UCHAR uLByteIndex = 0U;

	if (NULL == lpChaticCache || NULL == lpFillData || uCount > MAX_CHATIC_SIZE)
		return Error_Param;

	uLByteIndex = *lpFillData;

	if (!(lpChaticCache[*lpFillData].bOwn))
		lpChaticCache[*lpFillData].bOwn = true;

	for (uByteIndex += 1U; uByteIndex < uCount; ++uByteIndex)
	{
		if (!(lpChaticCache[*lpFillData].sBCache[lpFillData[uByteIndex]].bOwn))
			lpChaticCache[*lpFillData].sBCache[lpFillData[uByteIndex]].bOwn = true;
		if (!(lpChaticCache[*lpFillData].sBCache[lpFillData[uByteIndex]].bPUnit[uLByteIndex]))
			lpChaticCache[*lpFillData].sBCache[lpFillData[uByteIndex]].bPUnit[uLByteIndex] = true;
		uLByteIndex = lpFillData[uByteIndex];
	}
	return Error_Succeed;
}

//比较缓存特征数据;
inline int _cdecl ChaticCache_Cmps(PCHARACTERISTIC_CACHE lpChaticCache, const UCHAR * lpCmpsData, size_t uCount)
{
	register USHORT uByteIndex = 0U;
	register UCHAR uLByteIndex = 0U;

	UCHAR uExcluData[MAX_CHATIC_SIZE] = { 0U };
	const size_t uMinChaticCodeSize = uCount / sizeof(DWORD); //提高精确性,对抗外部干扰[特征码重复数据量较少,作为一种规范];

	if (NULL == lpChaticCache || NULL == lpCmpsData || uCount > MAX_CHATIC_SIZE)
		return Error_Param;

	if (!(lpChaticCache[*lpCmpsData].bOwn))
		return Error_Fail;
	else
		uLByteIndex = *lpCmpsData;

	for (uByteIndex += 1U; uByteIndex < uCount; ++uByteIndex)
	{
		if ((++uExcluData[uLByteIndex]) > uMinChaticCodeSize)
			return Error_Fail;
		else if (!(lpChaticCache[*lpCmpsData].sBCache[lpCmpsData[uByteIndex]].bOwn))
			return Error_Fail;
		else if (!(lpChaticCache[*lpCmpsData].sBCache[lpCmpsData[uByteIndex]].bPUnit[uLByteIndex]))
			return Error_Fail;
		else
			uLByteIndex = lpCmpsData[uByteIndex];
	}
	return Error_Succeed;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值