From 6ad6a8022e1d1b4eb0800ae9d7b2728e37f28932 Mon Sep 17 00:00:00 2001 From: LettuceLeaves <2878506229@qq.com> Date: Fri, 21 Nov 2025 01:37:52 +0800 Subject: [PATCH] =?UTF-8?q?fix(core):=E4=BD=BF=E7=94=A8=E4=BD=8D=E8=BF=90?= =?UTF-8?q?=E7=AE=97=E8=A7=A3=E5=86=B3=E6=9E=81=E7=AB=AF=E6=83=85=E5=86=B5?= =?UTF-8?q?=E4=B8=8BMath.abs()=E5=A4=B1=E8=B4=A5=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84BitSet=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v7/core/text/bloom/AbstractFilter.java | 4 +-- .../hutool/v7/core/text/bloom/FuncFilter.java | 26 ++++++++++++++----- .../text/bloom/BitMapBloomFilterTest.java | 3 +++ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/text/bloom/AbstractFilter.java b/hutool-core/src/main/java/cn/hutool/v7/core/text/bloom/AbstractFilter.java index ae2e7c3b7..9b8f9c3e2 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/text/bloom/AbstractFilter.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/text/bloom/AbstractFilter.java @@ -50,12 +50,12 @@ public abstract class AbstractFilter implements BloomFilter { @Override public boolean contains(final String str) { - return bitSet.get(Math.abs(hash(str))); + return bitSet.get(hash(str)); } @Override public boolean add(final String str) { - final int hash = Math.abs(hash(str)); + final int hash = hash(str); if (bitSet.get(hash)) { return false; } diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/text/bloom/FuncFilter.java b/hutool-core/src/main/java/cn/hutool/v7/core/text/bloom/FuncFilter.java index 28b3d1c26..f76446838 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/text/bloom/FuncFilter.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/text/bloom/FuncFilter.java @@ -51,28 +51,40 @@ public class FuncFilter extends AbstractFilter { /** * @param size 最大值 - * @param hashFunc Hash函数 + * @param hashFuncs Hash函数 */ @SafeVarargs - public FuncFilter(final int size, final Function... hashFunc) { + public FuncFilter(final int size, final Function... hashFuncs) { super(size); - Assert.notEmpty(hashFunc, "Hash functions must not be empty"); - this.hashFuncs = Collections.unmodifiableList(Arrays.asList(hashFunc)); + Assert.notEmpty(hashFuncs, "Hash functions must not be empty"); + this.hashFuncs = Collections.unmodifiableList(Arrays.asList(hashFuncs)); } + /** + *兼容父类,如果存在多个哈希函数,就使用第一个 + * + * @param str 字符串 + */ @Override public int hash(final String str) { return hash(str, hashFuncs.get(0)); } + /** + * + * @param str 字符串 + * @param hashFunc 哈希函数 + * @return HashCode 指定哈希函数的计算结果 + */ public int hash(final String str, final Function hashFunc) { - return hashFunc.apply(str).intValue() % size; + // 通过位运算获取正数 + return (hashFunc.apply(str).intValue() & 0x7FFFFFFF) % size; } @Override public boolean contains(final String str) { for (final Function hashFunc : hashFuncs) { - if (!bitSet.get(Math.abs(hash(str, hashFunc)))) { + if (!bitSet.get(hash(str, hashFunc))) { return false; } } @@ -83,7 +95,7 @@ public class FuncFilter extends AbstractFilter { public boolean add(final String str) { boolean add = false; for (final Function hashFunc : hashFuncs) { - int hash = Math.abs(hash(str, hashFunc)); + int hash = hash(str, hashFunc); if (!bitSet.get(hash)) { bitSet.set(hash); add = true; diff --git a/hutool-core/src/test/java/cn/hutool/v7/core/text/bloom/BitMapBloomFilterTest.java b/hutool-core/src/test/java/cn/hutool/v7/core/text/bloom/BitMapBloomFilterTest.java index 6706e34d7..2a06d7a89 100644 --- a/hutool-core/src/test/java/cn/hutool/v7/core/text/bloom/BitMapBloomFilterTest.java +++ b/hutool-core/src/test/java/cn/hutool/v7/core/text/bloom/BitMapBloomFilterTest.java @@ -20,6 +20,8 @@ import cn.hutool.v7.core.codec.hash.HashUtil; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.util.BitSet; + public class BitMapBloomFilterTest { @Test @@ -35,4 +37,5 @@ public class BitMapBloomFilterTest { Assertions.assertTrue(filter.contains("ddd")); Assertions.assertTrue(filter.contains("123")); } + }