本文简介:此前我们了解过二叉树算法,哈希算法,二分法等等,其中由最常用的二叉树算法演变过来的哈希算法乃是从刚开始就学过的,此次因为一些项目的需要,要做一个类似ispell 的软件,其中会产生大量的对单词的查找操作,于是经过一翻研究,得出以下HASH算法,经过验证比一般的查表的FNV HASH算法产生的分布曲线基本没什么两样,并且在大部分的不同字典下,本算法要比查表的FNV HASH算法表现出速度更快,分布更
此前我们了解过二叉树算法,哈希算法,二分法等等,其中由最常用的二叉树算法演变过来的哈希算法乃是从刚开始就学过的,此次因为一些项目的需要,要做一个类似ispell 的软件,其中会产生大量的对单词的查找操作,于是经过一翻研究,得出以下HASH算法,经过验证比一般的查表的FNV HASH算法产生的分布曲线基本没什么两样,并且在大部分的不同字典下,本算法要比查表的FNV HASH算法表现出速度更快,分布更均匀。但是因为是实验结果,所以暂时还没得出有效的数学推论,但是从大量的不同的字典测试数据来看,此算法确实效率不错。
由于以前没有涉及过相关的纯算法的设计,所以刚刚开始的时候,打算随便选用一种HASH,比如说用%除大质数,然后借此搭建一个比较强壮的测试环境,然后打算根据测试结果来改进HASH算法的模型。
最开始,我的HASH函数是这样的:
unsigned int hash_func(char *str, int len)
{
register unsigned int sum = 0;
register char *p = str;
while(p - str < len)
sum += *(p++);
return sum % MAX_PRIME_LESS_THAN_HASH_LEN;
}
非常简单,但是这是绝对不可取的,通过这个函数,我选取了一个23w词的字典做为测试,当HASH SIZE=1024的时候,震荡幅度相当大,那么如何来改进呢?首先想到可能产生的冲突的是这种情况:abcd和acbd,对于这两种单词来说,如果用上面的HASH函数,就一定会发生碰撞,为什么呢?因为每个字符少了关于它自己的位置信息,于是第一次改进版本的HASH函数就给每个字符加上了它的位置信息,将上面所描述的函数改进为:
unsigned int hash_func(char *str, int len)
{
register unsigned int sum = 0;
register char *p = str;
while(p - str < len)
sum += *(p++) * (p–str);
return sum % MAX_PRIME_LESS_THAN_HASH_LEN;
}
某种程度上来说,比不带位置信息产生的分布图要好多了,但是仍然非常的不均匀。那么接来分析产生分布不均匀的原因,因为是用的乘法,所以仍然太过于依赖字母产生的结果了。于是改用XOR操作,选用以下函数:
unsigned int hash_func(char *str, int len)
{
register unsigned int sum = 0;
register char *p = str;
while(p - str < len)
sum += (*(p++) * (p–str)) ^ sum;
return sum % MAX_PRIME_LESS_THAN_HASH_LEN;
}
虽然震荡幅度比较,不过做出来的regression line明显比上两张图片平得多了。但是结果仍然非常不好,从800到100的range太大。原因还是因为数据分布得不够均匀,于是思考单独的用加法来算是不是不太好,根据其他查表类HASH算法的过程,发现其大多都用了高低位来组合成最后的结果,于是我也采用了他们的方法:
unsigned int hash_func(char *str, int len)
{
register unsigned int sum = 0;
register unsigned int h = 0;
register char *p = str;
while(p - s < len)
{
register unsigned short a = *(p++);
sum ^= a * (p - str);
h ^= a / (p - str);
}
return ((sum << 16) | h) % MAX_PRIME_LESS_THAN_HASH_LEN;
}
最后得出结论,不用查表的方法,而通过字符串本身的位置对字符本身进行修正的方法也能得到结果相当满意的HASH函数,之后换了几个大小不同的字典进行测试,得出的图象都大致和上图一致,非常令人满意。对于这个项目,包括如何检查单词错误,和自动修正等等相关的内容,会随着项目的完成一一在整理成文档,希望大家支持。
立即下载试用静态数据泄露该怎么预防?
在信息技术中,静态数据面临意外损坏、黑客和内部威胁的数据泄漏风险,这些威胁可以通过数字方式访问数据或物理窃取数据存储介质。为了防止静态数据遭到泄漏,企业逐步开始使用安全控制,例如密码保护、数据加密、物理控制、监视等来对静态数据进行防护。
静态数据是指数字形式的计算机数据,例如云存储、文件托管服务、数据库或数据仓库。静态数据包括结构化和非结构化数据。
保护静态数据的重要性
几乎每个企业都面临重大数据泄漏的风险。问题是:攻击者是否更有可能在存储或传输数据时窃取数据?
存储的数据通常被认为是恶意黑客更具吸引力的目标。的确,数据在其生命周期的许多点上都容易受到攻击,当数字数据长时间存储在特定的存储配置中时,网络攻击者会假设它具有价值,如果被盗,那么它将对企业产生严重的危害。事实上,静态数据通常是企业中最敏感的数据,数据泄漏不仅会给企业、客户和合作伙伴企业造成巨大损失,还会损害公司的声誉,并导致监管罚款和民事责任。
保护静态数据的最佳实践
保护存储数据的最佳做法包括:
■数据分类 — 企业需要知道哪些数据在存储中、存储位置、其重要性以及如何保护这些数据。数据分类是根据敏感度识别和企业数据的主动措施。企业需要评估其数据和应用程序并确定其优先级,以确定对其业务流程最重要的内容。数据分类可用于自动化流程并确保一致地应用标准,您可以运用安企神文档透明加密,他内置敏感内容识别,可以根据您设置的策略自动按照数据的敏感程度进行分类。
■数据加密 – 确保未经授权的访问无法查看数据。企业可以在移动敏感文件之前对其进行加密,也可以使用全磁盘加密来保护整个存储介质,您可以是用安企神文档透明加密,他可以对全盘文件进行透明加密,保证您工作效率的同时对数据进行加密保护。
■分层保护——此方法允许企业对不同敏感度级别的数据设置访问控制,并根据这些级别分配访问控制。
安企神的数据安全
安企神通过现代且简化的安全和合规性自动化方法保护混合多云环境中的所有数据工作负载。灵活的架构支持广泛的数据存储库和云,确保安全控制和策略在任何地方得到一致的应用。
本文为收集整理,文章部分观点不代表本站观点,如有侵权或其它问题请反馈客服。https://www.wgj7.com/cjwt/16498.html