From 6c68d4658b6faacdf222257f90f3362b2922d432 Mon Sep 17 00:00:00 2001 From: Looly Date: Mon, 10 Jan 2022 08:28:38 +0800 Subject: [PATCH] add hash --- CHANGELOG.md | 1 + .../cn/hutool/core/lang/hash/KetamaHash.java | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100755 hutool-core/src/main/java/cn/hutool/core/lang/hash/KetamaHash.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 2dab59eda..947c1d987 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ ### 🐣新特性 * 【core 】 增加对null值友好的groupingBy操作的Collector实现,可指定map类型(pr#498@Gitee) +* 【core 】 增加KetamaHash(issue#2084@Github) * ### 🐞Bug修复 * 【core 】 修复setter重载导致匹配错误(issue#2082@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/lang/hash/KetamaHash.java b/hutool-core/src/main/java/cn/hutool/core/lang/hash/KetamaHash.java new file mode 100755 index 000000000..bc2f3cbf2 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/lang/hash/KetamaHash.java @@ -0,0 +1,51 @@ +package cn.hutool.core.lang.hash; + +import cn.hutool.core.exceptions.UtilException; +import cn.hutool.core.util.StrUtil; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * Ketama算法,用于在一致性Hash中快速定位服务器位置 + * + * @author looly + * @since 5.7.20 + */ +public class KetamaHash implements Hash64, Hash32 { + + @Override + public long hash64(String key) { + byte[] bKey = md5(key); + return ((long) (bKey[3] & 0xFF) << 24) + | ((long) (bKey[2] & 0xFF) << 16) + | ((long) (bKey[1] & 0xFF) << 8) + | (bKey[0] & 0xFF); + } + + @Override + public int hash32(String key) { + return (int) (hash64(key) & 0xffffffffL); + } + + @Override + public Number hash(String key) { + return hash64(key); + } + + /** + * 计算MD5值,使用UTF-8编码 + * + * @param key 被计算的键 + * @return MD5值 + */ + private static byte[] md5(String key) { + final MessageDigest md5; + try { + md5 = MessageDigest.getInstance("MD5"); + } catch (NoSuchAlgorithmException e) { + throw new UtilException("MD5 algorithm not suooport!", e); + } + return md5.digest(StrUtil.utf8Bytes(key)); + } +}