简单之特征检测缓存设计
2015-11-28 19:49
411 查看
在开发中,很多人都在为效率,精确与安全方面做最大的平衡,但结果往往不如人意,没有完美的解决方案,只有针对性的对象与方法,不同的方向有不同的需要,过于追求完美最终受伤的还是自己。想做一个高效但精确度较低的简单特征检测设计,感觉到了利弊的矛盾,但凡是都值得一试!
#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; }
相关文章推荐
- OpenCV3.0+CodeBlocks13.12环境配置
- [Ora]TNS-12537报错解决方法
- java中静态方法与实例方法的区别
- c#socket
- 信息安全系统设计基础实验四:外设驱动程序设计
- Stack Overflow 上人气最旺的 10 个 Java 问题
- 配置openmesh总是出现error LNK2019: 无法解析的外部符号此类问题的解决办法
- 阿里数据挖掘比赛总结
- Hadoop 2.6.0动态添加节点
- Hadoop 2.6.0动态添加节点
- Spring整合Struts2 wel.xml中写spring核心配置文件路径问题,顺便总结下我学习SSH整合的过程
- app创建技巧
- 【UML学习】UML的基本构成
- 初识HTML
- mysql
- 数据结构-哈夫曼树
- Windows程序==>>使用ListView控件展示数据
- JavaFX入门(一):我的第一个JavaFX程序
- nodejs学习1---基础知识
- metasploit基础