package org.springblade.questionnaire.questionnairesendrecord;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
public class ShortUrlGenerator {
private static final String ALGORITHM = "MD5";
private static final String CHAR_SET = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
private static final int SHORT_URL_LENGTH = 8; // 短链接长度
public static String generate(String url) {
try {
String salt = generateSalt();
String urlWithSalt = url + salt;
MessageDigest md = MessageDigest.getInstance(ALGORITHM);
md.update(urlWithSalt.getBytes());
byte[] digest = md.digest();
BigInteger bi = new BigInteger(1, digest); // 确保正数
String hex = bi.toString(16).toLowerCase(); // 转换为小写十六进制
// 补足长度,确保足够长以从中抽取足够的字符
while (hex.length() < SHORT_URL_LENGTH * 4) {
hex += hex; // 将哈希串重复拼接以确保足够长
}
StringBuilder shortUrl = new StringBuilder(SHORT_URL_LENGTH);
for (int i = 0; i < SHORT_URL_LENGTH; i++) {
// 每次取4个字符转换成16进制数,然后用 & (CHAR_SET.length() - 1) 来确保索引在有效范围内
int index = Integer.parseInt(hex.substring(i * 4, i * 4 + 4), 16) % CHAR_SET.length();
shortUrl.append(CHAR_SET.charAt(index));
}
return shortUrl.toString();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
private static String generateSalt() {
return Long.toString(System.currentTimeMillis()) + new Random().nextInt(999999);
}
// 测试方法
public static void main(String[] args) {
System.out.println(generate("https://www.example.com"));
}
}