简介
一种非加密型哈希函数
特点
特点:
1.快 ,MurMurHash3 比 MD5 快
2.低碰撞,MurMurHash3 128 位版本哈希值是 128 位的,跟 MD5 一样。128 位的哈希值,在数据量只有千万级别的情况下,基本不用担心碰撞。
3.高混淆,散列值比较“均匀”,如果用于哈希表,布隆过滤器等, 元素就会均匀分布。
使用
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1.1-jre</version>
@Testpublic void testCreateShortLink() {Random random = new Random();for (int i = 0; i < 100; i++) {int num1 = random.nextInt(10);int num2 = random.nextInt(1000000);int num3 = random.nextInt(1000000);String originalUrl = num1 + "xdclass" + num2 + ".net" + num3;String shortLinkCode = shortLinkComponent.createShortLinkCode(originalUrl);log.info("originalUrl:" + originalUrl + ", shortLinkCode=" + shortLinkCode);}}
长链转短链
/*** 创建短链* @param originalUrl* @return db编码+6位短链编码*/public String createShortLinkCode(String originalUrl){long murmur32 = CommonUtil.murmurHash32(originalUrl);//转62进制String shortLinkCode = encodeToBase62(murmur32);return code;}
工具类
/*** murmur hash算法* @param param* @return*/public static long murmurHash32(String param){long murmur32 = Hashing.murmur3_32().hashUnencodedChars(param).padToLong();return murmur32;}
private static final String CHARS =
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";/*** 10进制转62进制* @param num* @return*/private static String encodeToBase62(long num) {//StringBuffer:线程安全; StringBuilder:线程不安全StringBuffer sb = new StringBuffer();do {int i = (int) (num % 62);sb.append(CHARS.charAt(i));num /= 62;// num = num/ 62;} while (num > 0);String value = sb.reverse().toString();return value;}