最近一直在研究Lucene的源码,其中有许多设计到hash算法的地方。于是自己整理一下,以加深自己的理解。这只是我个人的理解。如果有不对的地方。希望大家勇于拍砖。
TermsHashPerField.java中有一个hash算法:
final char[] tokenText = termAtt.buffer();
final int tokenTextLen = termAtt.length();
// Compute hashcode & replace any invalid UTF16 sequences
int downto = tokenTextLen;
int code = 0;
while (downto > 0) {
char ch = tokenText[--downto];
if (ch >= UnicodeUtil.UNI_SUR_LOW_START && ch <= UnicodeUtil.UNI_SUR_LOW_END) {
if (0 == downto) {
// Unpaired
ch = tokenText[downto] = UnicodeUtil.UNI_REPLACEMENT_CHAR;
} else {
final char ch2 = tokenText[downto-1];
if (ch2 >= UnicodeUtil.UNI_SUR_HIGH_START && ch2 <= UnicodeUtil.UNI_SUR_HIGH_END) {
// OK: high followed by low. This is a valid
// surrogate pair.
code = ((code*31) + ch)*31+ch2;
downto--;
continue;
} else {
// Unpaired
ch = tokenText[downto] = UnicodeUtil.UNI_REPLACEMENT_CHAR;
}
}
} else if (ch >= UnicodeUtil.UNI_SUR_HIGH_START && (ch <= UnicodeUtil.UNI_SUR_HIGH_END ||
ch == 0xffff)) {
// Unpaired or 0xffff
ch = tokenText[downto] = UnicodeUtil.UNI_REPLACEMENT_CHAR;
}
code = (code*31) + ch;
}
int hashPos = code & postingsHashMask;
代码最后的hashPos是最终的hash值。如果仔细看一下的话,你就会发现上面代码的hash算法是不是非常的眼熟!
好好回忆一下自己是否见过,想起来了吧。是不是跟java自带的源码中的String的hashcode算法相似呢。呵呵。是否想起来了呢?如果没有,请赶紧温习一下java源码吧。呵呵。
分享到:
相关推荐
在FST构建的过程中,会使用到Hash算法来计算节点的hash值,并用这个值来判断该节点是否已经被存储在FSTbytes数组中。如果一个节点(例如node1)的hash值与HashMap中的某个key值匹配,那么该节点实际上已经存储在...
MurmurHash算法由Austin Appleby创建于2008年,现已应用到Hadoop、libstdc 、nginx、libmemcached,Redis,Memcached,Cassandra,HBase,Lucene等开源系统。2011年Appleby被Google雇佣,随后Google推出其变种的...
FST的优化技术主要包括:使用FST HashMap来加快判断某个节点是否已经在FST bytes中,使用Hash算法来快速判断节点是否已经被写入到FST bytes中等方面。 FST算法是Lucene中一个核心算法,具有快速检索term信息、快速...
3. **地理编码与解码**:使用GeoHash或其他算法将经纬度转换为字符串,便于存储和搜索。GeoHash是一种空间数据结构,能将地理坐标点映射成字符串,便于索引和比较。 4. **设置查询**:创建一个Query对象,可以根据...
- **Hash算法**: 在构建FST过程中,使用哈希表加快判断节点是否已存在。通过计算节点中所有Arc的信息(包括标签、目标节点、输出、是否为终止弧线等)生成哈希值,以此作为键值,节点在FSTBytes中的位置作为值。 ...
数据库算法和Google搜索引擎算法是信息技术领域中的核心组成部分,它们在数据管理和信息检索方面扮演着至关重要的角色。在本文中,我们将深入探讨这两个主题,并尝试揭示它们的秘密。 首先,让我们聚焦于数据库算法...
一致性Hash算法是解决分布式系统中的负载均衡问题的有效方法。 十六、数据库设计规范 数据库设计规范包括基础规范、命名规范、字段设计规范等。 十七、数据库索引 数据库索引包括唯一索引、非唯一索引、主键索引...
而优化的 Hash 加密算法的运用,不仅加强了数据的不可篡改性,也提高了数据的安全性。由于哈希值的唯一性,任何对数据的非法篡改都会在哈希值的改变中得以显现。这为综合管廊数据的安全存储提供了一道防线,确保数据...
于是,自研LBS服务成为优化的另一条路径,特别是在使用GeoHash算法的基础上。GeoHash是一种将经纬度坐标转化为可排序、可比较的字符串编码的技术,广泛应用于各种数据库系统,如MongoDB、Lucene/Solr和PostgreSQL/...
Elasticsearch可能会使用堆内存来存储索引数据,使用堆外内存(Off-Heap)来减少GC压力,以及通过缓存策略来优化内存使用,如使用Lucene的内存缓冲区来提升写入性能。此外,Elasticsearch还会有内存分配策略,比如...
分布式缓存的一致性hash算法 数据存储服务器集群的伸缩性设计 关系数据库集群的伸缩性设计 nosql数据库的伸缩性设计 随需应变:网站的可扩展性 构建可扩展的网站架构 利用分布式消息队列降低系统耦合性 ...
ElasticMaps Main的源码中会包含GeoHash的生成和解码算法,以及相关的空间查询优化。 3. **Spatial Query**:ElasticMaps支持多种空间查询,如Within、BoundingBox、Distance等。源码中会详细阐述如何构建这些查询...
因为词条唯一性,可以给词条创建索引,例如hash表结构索引。 倒排索引的搜索流程如下:用户输入条件,进行搜索,对用户输入内容分词,得到词条,拿着词条在倒排索引中查找,得到包含词条的文档id,拿着文档id到正向...
该库提供了用于b位MinHash算法的工具。 问题/问题 请提出。 (日本论坛在。) 安装 玛文 将以下依赖项放入pom.xml中: < groupId>org.codelibs < artifactId>minhash < version>0.2.0 参考 计算MinHash ...
Redis具有高速读写性能,支持多种数据类型如string、hash、list、set等,每种类型都有其特定的使用场景。此外,Redis的缓存雪崩、缓存穿透问题及其解决方法也是核心内容,还包括了渐进式ReHash的过程及其原因。渐进...
若需在事务环境下使用全文索引,可以考虑使用Sphinx或Lucene这样的外部搜索引擎。 创建索引的语法如下: ```sql CREATE INDEX index_name ON table_name(column_name(length)) [USING {BTREE|HASH}] COMMENT '...
在此次实验报告中将会...使用 jieba 与 lucene 对文本内容进行分词以此实现快速搜索,利用 SIFT 算法对图片进行特征提取,然后利用 Hash 对图片特征分类建立数据 库,在搜索过程中对待检索图片做同样操作以完成匹配。
一个Elasticsearch集群由多个节点(node)组成,每个节点可以包含多个分片(shard),数据通过hash算法均匀分布。此外,Elasticsearch还引入了index(类似数据库)、type(类似表,但在6.x版本后被废弃)和document(类似记录...
14. **一致性Hash算法**: - 在分布式系统中,一致性Hash用于解决节点增减时数据迁移问题。 15. **数据库范式**: - 1NF、2NF、3NF是数据库设计中的规范化原则,减少数据冗余和异常。 16. **数据库开发规范**: ...
后端架构师技术图谱是IT领域中针对后端开发人员和架构师的重要参考资料,它涵盖了从基础的数据结构和算法到高级的并发控制、数据库、分布式系统等多个方面。以下是根据提供的内容提炼出的关键知识点: 1. **数据...