使用一个哈希函数,如何将字符串转换为整型呢?
由于需要使用一个字符串键,作为分库分表的依据,那么我们必须将字符串转换为一个数值,然后取模,进行相应的操作,具体的方法如下所示
例
1.使用哈希函数将 字符串转换为 整型数值 2.对整型数值进行取模操作 3.对取模后的值,进行分库分表的路由逻辑计算
使用`String.hashCode()`并取模
/** * 根据字符串键计算分片索引 * * @param key 分片键(非空字符串) * @param modValue 分片总数(>0) * @return 对应的分片索引(0 ~ modValue - 1) */ public static int getShardingIndex(String key, int modValue) { if (key == null || modValue <= 0) { throw new IllegalArgumentException("参数非法"); } int hash = key.hashCode(); // 返回一个 int 类型的哈希值 return Math.abs(hash) % modValue; // 取绝对值后对分片数取模 }
例
String userId = "user12345"; int totalShards = 4; // 假设分 4 个库或表 int index = getShardingIndex(userId, totalShards); System.out.println("该用户应分配到分片:" + index);
代码说明
步骤 | 方法 | 作用 |
第一步 | `key.hashCode()` | 获取字符串的哈希值(`int`) |
第二步 | `Math.abs(...)` | 避免负数哈希值导致的异常结果 |
第三步 | `% modValue` | 取模得到对应的分片编号 |
注意事项: -`hashCode()` 是 Java 内置的哈希算法,适合简单场景 如果你有更高的均匀分布需求,可以考虑: -使用[Guava](https://github.com/google/guava) 的 `Hashing` 工具类。 -使用[MurmurHash](https://github.com/tnm/murmurhash-java) 等一致性更好的哈希算法。
优化建议
为了使哈希键均匀分布 此时我们可引入MurmurHash例
如果需要更均匀的分布,可引入 `MurmurHash3`: import com.google.common.hash.Hashing; public static int getShardingIndexWithMurmur(String key, int modValue) { if (key == null || modValue <= 0) { throw new IllegalArgumentException("参数非法"); } long hash = Hashing.murmur3_32().hashUnencodedChars(key).padToLong(); return Math.abs((int) hash) % modValue; } 引入Guava依赖 <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> </dependency>
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。