日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

代码工具---长链接转换短链接

發布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 代码工具---长链接转换短链接 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

方式一

缺點:數據加密性不好,容易被猜出來,比如,產生數據:00001、然后被惡意撞庫00002
優點:嚴格的自增id,不會產生重復的短key
maven 依賴

<dependency><groupId>commons-lang</groupId><artifactId>commons-lang</artifactId><version>2.6</version></dependency>

工具源碼:

import org.apache.commons.lang.StringUtils;/*** @author chunyang.leng* @date 2021-10-25 9:17 上午*/ public class ShortUrl {/*** 進制*/private static final int SCALE = 62;/*** 最小長度,超過該長度,自動補0*/private static final int MIN_LENGTH = 5;/*** 常量字符串*/private static final String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";/*** 數字轉指定進制編碼* @see ShortUrl#SCALE 進制* @param num 待轉換待數據id,可以為雪花id,或者數據庫自增數據id* @return 62進制編碼*/public static String encode(long num) {StringBuilder sb = new StringBuilder();int remainder;while (num > SCALE - 1) {// 對 scale 進行求余,然后將余數追加至 sb 中,由于是從末位開始追加的,因此最后需要反轉字符串remainder = Long.valueOf(num % SCALE).intValue();sb.append(chars.charAt(remainder));// 除以進制數,獲取下一個末尾數num = num / SCALE;}sb.append(chars.charAt(Long.valueOf(num).intValue()));String value = sb.reverse().toString();return StringUtils.leftPad(value, MIN_LENGTH, '0');}/*** 指定進制轉為數字* @see ShortUrl#SCALE 進制* @param str 加密字符串* @return 原始數據id*/public static long decode(String str) {//將 0 開頭的字符串進行替換str = str.replace("^0*", "");long value = 0;char tempChar;int tempCharValue;for (int i = 0; i < str.length(); i++) {//獲取字符tempChar = str.charAt(i);//單字符值tempCharValue = chars.indexOf(tempChar);//單字符值在進制規則下表示的值value += (long) (tempCharValue * Math.pow(SCALE, str.length() - i - 1));}return value;}}

方式二

缺點:依托外部存儲,需要自行解決存儲和kv映射問題,包括并發問題等,生成的key可能存在碰撞情況
優點:加密型好,撞庫可能性不大

import java.util.HashMap; import java.util.Map; import java.util.concurrent.ThreadLocalRandom;/*** @author chunyang.leng* @date 2021-07-15 5:19 下午*/ public abstract class Test {/*** 隨機字符串*/private static final String ALPHABET = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";/*** 隨機key長度*/private static final int KEY_LENGTH = 5;public String buildShortLinkKey() {int length = ALPHABET.length();for (; ; ) {StringBuilder sb = new StringBuilder();for (int i = 0; i < KEY_LENGTH; i++) {sb.append(ALPHABET.charAt(ThreadLocalRandom.current().nextInt(length)));}String key = sb.toString();if (!check(key)) {// key 不沖突,直接返回return key;}}}/*** 檢查key是否已存在** @param shortLinkKey 待檢查的key* @return key 是否存在*/abstract boolean check(String shortLinkKey);/*** 根據短key,獲取原始key** @param shortLinkKey 短key* @return 原始key*/abstract String getOrangeLink(String shortLinkKey);/*** 存儲映射關系** @param shortLinkKey 短key* @param orangeLink 原始key*/abstract void saveMapping(String shortLinkKey, String orangeLink);public static void main(String[] args) {Test test = new Test() {Map<String, String> map = new HashMap<String, String>();/*** 檢查key是否已存在** @param shortLinkKey 待檢查的key* @return key 是否存在*/@Overrideboolean check(String shortLinkKey) {return map.containsKey(shortLinkKey);}/*** 根據短key,獲取原始key** @param shortLinkKey 短key* @return 原始key*/@OverrideString getOrangeLink(String shortLinkKey) {return map.get(shortLinkKey);}/*** 存儲映射關系** @param shortLinkKey 短key* @param orangeLink 原始key*/@Overridevoid saveMapping(String shortLinkKey, String orangeLink) {map.put(shortLinkKey, orangeLink);}};for (int i = 0; i < 1000 ; i++) {String shortLinkKey = test.buildShortLinkKey();test.saveMapping(shortLinkKey,"www.xxxxx.com");String orangeLink = test.getOrangeLink(shortLinkKey);}} }

總結

以上是生活随笔為你收集整理的代码工具---长链接转换短链接的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。