提供一个短 url 生成算法:
1、借助于 hash 算法生成 hash code
2、将 hash code 值转换为短链接字符串
算法实现
package com.skysper.component;
import com.google.common.hash.HashCode;import com.google.common.hash.Hashing;
import java.nio.charset.Charset;
/** * 短网址 */public class ShortUrl {
private ShortUrl() { }
//存在hash碰撞的情况 private static int getHashCode(String code) { HashCode result = Hashing.murmur3_32().hashString(code, Charset.forName("UTF-8")); // 移除负数情况 return result.asInt() & 0x7fffffff; }
private static final String CHARS = "0123456789abcdefghijqlmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXWZ"; private static final char[] ARRAY = CHARS.toCharArray(); private static final int CHARS_LENGTH = 62;
/** * 针对返回的hash code进行62进制转化 * @param url * @return */ public static String hash(String url) { int code = getHashCode(url); StringBuilder stringBuilder = new StringBuilder(); while(code > 0) { int index = code % CHARS_LENGTH; code = code / CHARS_LENGTH; stringBuilder.insert(0,ARRAY[index]); } return stringBuilder.toString(); }
}
复制代码
幂等支持
对于同一个 url 生成 hash 相同,此时根据得到的短链接获取原始链接,如果一致,则返回当前的短链接,否则认定为 hash 冲突,执行 hash 冲突的处理逻辑
hash 冲突
1、提供多个 hash 算法,冲突时依次选择新的算法生成
2、对于结果短链接进行二次 hash
评论