自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Java實現(xiàn)短網址服務的原理是什么?

開發(fā)
針對于有些用戶擔心短網址會不會重復的問題,現(xiàn)將縮鏈平臺短網址服務的原理進行了詳細介紹,以便用戶對短網址有更深的理解,消除其擔心。

針對于有些用戶擔心短網址會不會重復的問題,現(xiàn)將縮鏈(https://suolink.cn)平臺短網址服務的原理進行了詳細介紹,以便用戶對短網址有更深的理解,消除其擔心。

Q:那么小的長度應該有一定概率會重復的吧?是不是一定時間后就不可用了?

A:短網址(Short URL),顧名思義就是在形式上比較短的網址。通常用的是asp或者php轉向,在Web 2.0的今天,不得不說,這是一個潮流。目前已經有許多類似服務,借助短網址您可以用簡短的網址替代原來冗長的網址,讓使用者可以更容易的分享鏈接。

短網址服務,可能很多朋友都已經不再陌生,現(xiàn)在大部分微博、手機郵件提醒等地方已經有很多應用模式了,并占據(jù)了一定的市場。估計很多朋友現(xiàn)在也正在使用。

看過新浪的短連接服務,發(fā)現(xiàn)后面主要有6個字符串組成,于是第一個想到的就是原來公司寫的一個游戲激活碼規(guī)則,也就是下面的算法2,

26個大寫字母 26小寫字母,10個數(shù)字,隨機生成6個然后插入數(shù)據(jù)庫對應一個id,短連接跳轉的時候,根據(jù)字符串查詢到對應id,即可實現(xiàn)相應的跳轉!不過2的62次方,不知道有沒有重復的,小概率可以,但是對應不是很大的網站應該足夠了

自從twitter推出短網址(shorturl),繼之國內各大微博跟風,google公開goo.gl使用API,短網址之風愈演愈烈.不得不說這是一個新興又一大熱門web2.0服務.現(xiàn)整理一下,包括完整短網址網站,短網址生成原理,算法舉例,以及優(yōu)劣比較。

短鏈接的好處:

  • 內容需要;
  • 用戶友好;
  • 便于管理。

為什么要這樣做的,原因我想有這樣幾點:

微博限制字數(shù)為140字一條,那么如果我們需要發(fā)一些連接上去,但是這個連接非常的長,以至于將近要占用我們內容的一半篇幅,這肯定是不能被允許的,所以短網址應運而生了。

短網址可以在我們項目里可以很好的對開放級URL進行管理。有一部分網址可以會涵蓋暴力,廣告等信息,這樣我們可以通過用戶的舉報,完全管理這個連接將不出現(xiàn)在我們的應用中,應為同樣的URL通過加密算法之后,得到的地址是一樣的。

我們可以對一系列的網址進行流量,點擊等統(tǒng)計,挖掘出大多數(shù)用戶的關注點,這樣有利于我們對項目的后續(xù)工作更好的作出決策。

算法原理

算法一

1)將長網址md5生成32位簽名串,分為4段, 每段8個字節(jié);

2)對這四段循環(huán)處理, 取8個字節(jié), 將他看成16進制串與0x3fffffff(30位1)與操作, 即超過30位的忽略處理;

3)這30位分成6段, 每5位的數(shù)字作為字母表的索引取得特定字符, 依次進行獲得6位字符串;

4)總的md5串可以獲得4個6位串; 取里面的任意一個就可作為這個長url的短url地址;

這種算法,雖然會生成4個,但是仍然存在重復幾率,下面的算法一和三,就是這種的實現(xiàn).

算法二

a-zA-Z0-9 這64位取6位組合,可產生500多億個組合數(shù)量.把數(shù)字和字符組合做一定的映射,就可以產生唯一的字符串,如第62個組合就是aaaaa9,第63個組合就是aaaaba,再利用洗牌算法,把原字符串打亂后保存,那么對應位置的組合字符串就會是無序的組合。

把長網址存入數(shù)據(jù)庫,取返回的id,找出對應的字符串,例如返回ID為1,那么對應上面的字符串組合就是bbb,同理 ID為2時,字符串組合為bba,依次類推,直至到達64種組合后才會出現(xiàn)重復的可能,所以如果用上面的62個字符,任意取6個字符組合成字符串的話,你的數(shù)據(jù)存量達到500多億后才會出現(xiàn)重復的可能。

具體參看這里徹底完善新浪微博接口和超短URL算法,算法四可以算作是此算法的一種實現(xiàn),此算法一般不會重復,但是如果是統(tǒng)計的話,就有很大問題,特別是對域名相關的統(tǒng)計,就抓瞎了。

JAVA 實現(xiàn)代碼:

public class ShortUrlGenerator {
/**
@param args
*/
public static void main(String[] args) {
String sLongUrl = "QQ空間"; //長鏈接
String[] aResult = shortUrl(sLongUrl);
// 打印出結果
for (int i = 0; i < aResult.length; i++) {
System.out.println("["
ystem.out.println("[" + i + "]:::" + aResult[i]);
}
}
public static String[] shortUrl(String url) {
// 可以自定義生成 MD5 加密字符傳前的混合 KEY
String key = "mengdelong";
// 要使用生成 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 sMD5EncryptResult = (new Encrypt()).md5(key
tring sMD5EncryptResult = (new Encrypt()).md5(key + url);
String hex = sMD5EncryptResult;
String[] resUrl = new String[4];
for (int i = 0; i < 4; i++) {
// 把加密字符按照 8 位一組 16 進制與 0x3FFFFFFF 進行位與運算
String sTempSubString = hex.substring(i
tring 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 進行位與運算,取得字符數(shù)組 chars 索引
long index = 0x0000003D & lHexLong;
// 把取得的字符相加
outChars += chars[(int) index];
// 每次循環(huán)按位右移 5 位
lHexLong = lHexLong >> 5;
}
// 把字符串存入對應索引的輸出數(shù)組
resUrl[i] = outChars;
}
return resUrl;
}
}


責任編輯:未麗燕 來源: 今日頭條
相關推薦

2017-11-22 10:53:22

2017-10-12 15:34:17

2018-10-15 12:42:21

2024-06-06 08:53:13

動態(tài)鏈接庫共享庫

2025-03-27 04:00:00

2024-01-11 08:53:58

2025-01-15 13:30:48

FeignHTTPJava

2023-11-05 10:52:54

DNS服務器瀏覽器

2017-05-17 12:33:16

程序員系統(tǒng)二進制

2024-04-19 08:23:06

2021-04-27 18:12:22

WebSocket持久化連接HTTP

2021-09-10 06:50:03

HashMapHash方法

2023-03-17 16:47:23

索引開發(fā)大數(shù)據(jù)

2024-11-25 12:20:00

Hystrix微服務架構

2021-02-02 18:02:09

java對象數(shù)據(jù)

2021-02-08 21:07:47

JavaCAS機制

2025-01-09 08:32:50

2021-09-27 08:02:17

CDN加速網站網絡

2021-05-09 09:30:13

Docker操作系統(tǒng)容器

2025-04-02 01:22:44

MySQL樂觀鎖數(shù)據(jù)
點贊
收藏

51CTO技術棧公眾號