Hash 算法 - HashUtil¶
由来¶
提供多种经典哈希算法的实现,包括 FNV、BKDR、DJB 等。这些算法在哈希表、布隆过滤器等场景中有广泛应用。
方法¶
from hutool import HashUtil
# FNV 哈希
HashUtil.fnv1(b"hello") # FNV1 哈希值
HashUtil.fnv1a(b"hello") # FNV1a 哈希值
# 字符串哈希
HashUtil.bkdr_hash("hello") # BKDR 哈希
HashUtil.ap_hash("hello") # AP 哈希
HashUtil.djb_hash("hello") # DJB 哈希
HashUtil.js_hash("hello") # JS 哈希
HashUtil.rs_hash("hello") # RS 哈希
HashUtil.sdbm_hash("hello") # SDBM 哈希
HashUtil.elf_hash("hello") # ELF 哈希
HashUtil.dek_hash("hello") # DEK 哈希
# Java hashCode 兼容
HashUtil.java_hash_code("hello") # 与 Java 的 "hello".hashCode() 一致
# 累加哈希
HashUtil.additive_hash("hello", 1009) # 按质数取模
# 旋转哈希
HashUtil.rotating_hash("hello", 1009)
# 一次一个哈希
HashUtil.one_by_one_hash("hello")
# Bernstein 哈希
HashUtil.bernstein_hash("hello")
# Thomas Wang 整数哈希
HashUtil.int_hash(42)
# TianL 哈希(64位)
HashUtil.tianl_hash("hello")
# 混合哈希(64位,高32位=hashCode,低32位=FNV-1)
HashUtil.mix_hash("hello")
# HF 哈希
HashUtil.hf_hash("hello")
HashUtil.hf_ip_hash("hello")
FNV 哈希(增强)¶
# fnvHash — FNV-1a 32 位哈希
HashUtil.fnv_hash(b"hello") # 32 位哈希值
HashUtil.fnv_hash("hello") # 支持字符串输入
Java 兼容¶
# javaDefaultHash — Java hashCode 完全兼容
HashUtil.java_default_hash("hello") # 与 Java 的 "hello".hashCode() 一致
对象标识哈希¶
# identityHashCode — 对象标识哈希(等价于 Python id())
obj = [1, 2, 3]
HashUtil.identity_hash_code(obj) # 基于对象标识的哈希值
MurmurHash / CityHash / MetroHash¶
# MurmurHash3 32位
HashUtil.murmur32(b"hello")
# MurmurHash2 64位
HashUtil.murmur64(b"hello")
# MurmurHash3 128位(返回 (h1, h2) 元组)
HashUtil.murmur128(b"hello")
# CityHash
HashUtil.city_hash32(b"hello")
HashUtil.city_hash64(b"hello")
HashUtil.city_hash128(b"hello") # (h1, h2)
# MetroHash
HashUtil.metro_hash64(b"hello")
HashUtil.metro_hash128(b"hello") # (h1, h2)
算法对比¶
算法 |
特点 |
适用场景 |
|---|---|---|
FNV1/FNV1a |
快速、分布均匀 |
通用哈希 |
BKDR |
简单、高效 |
字符串哈希 |
DJB |
分布好 |
字符串哈希 |
MurmurHash3 |
高性能、分布优秀 |
哈希表、布隆过滤器 |
CityHash |
高性能 64/128 位 |
大数据场景 |
Java hashCode |
与 Java 兼容 |
跨语言场景 |