Lucene中使用的hash算法

本文详细解读了Lucene源码中涉及到的哈希算法,特别关注了TermsHashPerField.java文件中的实现细节,并与Java内置的String hashcode算法进行了对比,帮助读者加深对哈希算法的理解。
最近一直在研究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源码吧。呵呵。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值