提供一个短 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
评论