腾讯 新浪 搜狐 短网址 算法 讨论一下,寻找最佳、最合理、最适合扩展的方案

志波同学
博客专家认证
2011-03-18 12:06:15
腾讯 新浪 搜狐 短网址 算法 讨论一下,寻找最佳、最合理、最适合扩展的方案

public static String[] getUrl(String url) {
// 可以自定义生成MD5加密字符传前的混合KEY
String key = "liuzhibo";
// 要使用生成URL的字符
String[] chars = new String[] { "a", "b", "c", "d", "e", "f", "g", "h",
"i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
"u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H",
"I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z"

};
// 对传入网址进行MD5加密
String hex = Md5Util.MD5Encode(url);
hex = Md5Util.MD5Encode(hex);
String[] resUrl = new String[4];

for (int i = 0; i < 4; i++) {
// 把加密字符按照8位一组16进制与0x3FFFFFFF进行位与运算
String tmp = hex.substring(i*8, (i+1) * 8);
// System.out.println("md5字符串" + i + ":" + tmp);
long hexint = 0x3FFFFFFF & Long.parseLong(tmp,16);
// System.out.println("md5与运算:" + i + ":" + hexint);
String outChars = "";
for (int j = 0; j < 6; j++) {
// 把得到的值与0x0000003D进行位与运算,取得字符数组chars索引
int index = (int)(0x0000003D & hexint);
// 把取得的字符相加
outChars += chars[index];
// 每次循环按位右移5位
hexint = hexint >> 5;
}
// 把字符串存入对应索引的输出数组
resUrl[i] = outChars;
}

return resUrl;
}

/**
* 产生随机字符串
* */
private static Random randGen = null;
private static char[] numbersAndLetters = null;
private static Object initLock = new Object();
public static final String randomString(int length) {

if (length < 1) {
return null;
}
if (randGen == null) {
synchronized (initLock) {
if (randGen == null) {
randGen = new Random();
numbersAndLetters = ("0123456789abcdefghijklmnopqrstuvwxyz" +
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
//numbersAndLetters = ("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ").toCharArray();
}
}
}
char [] randBuffer = new char[length];
for (int i=0; i<randBuffer.length; i++) {
randBuffer[i] = numbersAndLetters[randGen.nextInt(71)];
//randBuffer[i] = numbersAndLetters[randGen.nextInt(35)];
}
return new String(randBuffer);
}

网上搜集的算法,进行测试了一下,采用随机算法生成长度为100的字符串,每10w数据大约有331条记录出现重复(不包括四次重复,因为getUrl该方法回返回一个长度为4的字符串数组,四次重复是指数组中的元素全部重复);每100w数据有30828条记录发生重复,有3条四次重复的数据;每1000w数据中有4864365多条发生重复的记录,四次重复记录太多。
大家帮分析一下算法是否有改进
...全文
648 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhongchi 2011-11-04
  • 打赏
  • 举报
回复
这一个要减小或避免冲突率得建立一种映射吧?
lb112152069 2011-03-18
  • 打赏
  • 举报
回复
如果光靠算法实现,几乎不太可能。

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧