问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何生成短链接 java

发布网友 发布时间:2022-04-22 18:46

我来回答

1个回答

热心网友 时间:2022-04-06 06:33

因公司推广需要,需要一套短链接生成方案,正好前几天在MSDN看到有人发了一个.net版的短链接算法,我就把它转换成java版,拿出来共享一下

生成思路:

1.将"原始链接(长链接)+key(自定义字符串,防止算法泄漏)"MD5加密

2.把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算,把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引,把取得的字符相加,每次循环按位右移 5 位,把字符串存入对应索引的输出数组(4组6位字符串)

3.生成4以下的随机数,从输入数组中取出随机数对应位置的字符串,作为短链,存入数据库或者NoSql

解析方式

编写一个web处理程序,把从ur(如:中解析短链接,将解析到的短链接(zAnuAn)与数据库中存入的原始链接进行匹配,跳转到匹配到的原始链接

package com.bjdata.test;

import java.security.MessageDigest;
import java.util.Random;


public class ShortUrlTest {
public static void main(String[] args) {
String sLongUrl = "/bbs/_t_278433840/"; // 原始链接
System.out.println("长链接:"+sLongUrl);
String[] aResult = shortUrl(sLongUrl);//将产生4组6位字符串
// 打印出结果
for (int i = 0; i < aResult.length; i++) {
System.out.println("[" + i + "]:" + aResult[i]);
}
Random random=new Random();
int j=random.nextInt(4);//产成4以内随机数
System.out.println("短链接:"+aResult[j]);//随机取一个作为短链
}

public static String[] shortUrl(String url) {
// 可以自定义生成 MD5 加密字符传前的混合 KEY
String key = "test";
// 要使用生成 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 = md5ByHex(key + url);

String[] resUrl = new String[4];
for (int i = 0; i < 4; i++) {

// 把加密字符按照 8 位一组 16 进制与 0x3FFFFFFF 进行位与运算
String sTempSubString = hex.substring(i * 8, i * 8 + 8);

// 这里需要使用 long 型来转换,因为 Inteper .parseInt() 只能处理 31 位 , 首位为符号位 , 如果不用long ,则会越界
long lHexLong = 0x3FFFFFFF & Long.parseLong(sTempSubString, 16);
String outChars = "";
for (int j = 0; j < 6; j++) {
// 把得到的值与 0x0000003D 进行位与运算,取得字符数组 chars 索引
long index = 0x0000003D & lHexLong;
// 把取得的字符相加
outChars += chars[(int) index];
// 每次循环按位右移 5 位
lHexLong = lHexLong >> 5;
}
// 把字符串存入对应索引的输出数组
resUrl[i] = outChars;
}
return resUrl;
}
/**
* MD5加密(32位大写)
* @param src
* @return
*/
public static String md5ByHex(String src) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] b = src.getBytes();
md.reset();
md.update(b);
byte[] hash = md.digest();
String hs = "";
String stmp = "";
for (int i = 0; i < hash.length; i++) {
stmp = Integer.toHexString(hash[i] & 0xFF);
if (stmp.length() == 1)
hs = hs + "0" + stmp;
else {
hs = hs + stmp;
}
}
return hs.toUpperCase();
} catch (Exception e) {
return "";
}
}

}

运行结果

长链接:http://www.51bi.com/bbs/_t_278433840/
[0]:fa6bUr
[1]:ryEfeq
[2]:zAnuAn
[3]:auIJne
短链接:zAnuAn

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
阳光燕山学校是贵族学校吗 小米14ultra跌至新低 小米14ultra值得购买吗 马卡龙多少钱一个 马卡龙为什么那么贵 正宗马卡龙多少钱一个-马卡龙为什么这么贵 今年河北的迁西板栗多少钱一斤、生的 板栗什么时候上市能卖到几月呢? 6月份能买到新鲜板栗吗? 睡眠银行的生物信息专家林晨瀚讲座谁有听过,对他们的生物信息助眠方法讲 ... 材料力学实验简介 网址短链接怎么生成? 如何设置微信权限 滴滴打车 乘客没付款一天了,会自动打给我钱吗? 还是怎么处理? 为什么滴滴打车没有广州到连山的啊怎么回事 [转载]ET200S和ET200M有什么差别 小朋友知道户外活动要注意那些事项? 户外运动应注意什么 雨天户外活动应注意哪些? 户外活动一般要注意哪些要点 户外运动要注意什么问题? 户外运动要注意些什么?有什么应对措施? 进行户外运动应注意什么? 有哪些关于勤俭节约的故事 月底去日本,那边什么东西最值得买 请告诉我两个勤俭节约的故事。(400字) spa蛇毒眼膜红色蓝色区别 蛇毒眼膜日本的和香港的一样吗 404 Not Found 征文:我的节约小故事 日本spa treatment蛇毒眼膜效果好吗 tb.cn这种短网址怎么生成的? 短链接生成网站推荐? 西门子plc s7 cp341与 s7 et200m\link有什么区别 怎么用pr做出路面文字 第39期 Pr CC Premiere怎样新建字幕简单的字幕创建 如何在PR里添加字体 用特百惠的保鲜盒冰菜好吗 特百惠杯子能放冰箱冷冻么 请问有谁会做特百惠的雪糕啊? 特百惠硬塑水杯放在冰箱冷冻层十几个小时会爆炸吗? 特百惠自制柠檬蜜放冰箱可以放多久 特百惠杯子能不能被摔坏? 特百惠是哪国的牌子? 大米放在特百惠盒子里还需要放冰箱吗 特百惠的发展历程 特百惠的发展历史有哪些? 为什么美国没有特百惠? 去除冰箱的味道的方法? ET200M和ET200S都应用到什么场合? 水泵扬程是指高度还是平面距离