【转】微博URL短网址生成算法原理及(java版、php版实现实例)
2017-02-21 22:59
886 查看
微博URL短网址生成算法原理及(java版、php版实现实例)
算法二
a-zA-Z0-9 这64位取6位组合,可产生500多亿个组合数量.把数字和字符组合做一定的映射,就可以产生唯一的字符串,如第62个组合就是aaaaa9,第63个组合就是aaaaba,再利用洗牌算法,把原字符串打乱后保存,那么对应位置的组合字符串就会是无序的组合。
把长网址存入数据库,取返回的id,找出对应的字符串,例如返回ID为1,那么对应上面的字符串组合就是bbb,同理 ID为2时,字符串组合为bba,依次类推,直至到达64种组合后才会出现重复的可能,所以如果用上面的62个字符,任意取6个字符组合成字符串的话,你的数据存量达到500多亿后才会出现重复的可能。
具体参看这里彻底完善新浪微博接口和超短URL算法,算法四可以算作是此算法的一种实现,此算法一般不会重复,但是如果是统计的话,就有很大问题,特别是对域名相关的统计,就抓瞎了。
跳转原理
当我们生成短链接之后,只需要在表中(数据库或者NoSql )存储原始链接与短链接的映射关系即可。当我们访问短链接时,只需要从映射关系中找到原始链接,即可跳转到原始链接。
附:控制长度?
算法二
a-zA-Z0-9 这64位取6位组合,可产生500多亿个组合数量.把数字和字符组合做一定的映射,就可以产生唯一的字符串,如第62个组合就是aaaaa9,第63个组合就是aaaaba,再利用洗牌算法,把原字符串打乱后保存,那么对应位置的组合字符串就会是无序的组合。
把长网址存入数据库,取返回的id,找出对应的字符串,例如返回ID为1,那么对应上面的字符串组合就是bbb,同理 ID为2时,字符串组合为bba,依次类推,直至到达64种组合后才会出现重复的可能,所以如果用上面的62个字符,任意取6个字符组合成字符串的话,你的数据存量达到500多亿后才会出现重复的可能。
具体参看这里彻底完善新浪微博接口和超短URL算法,算法四可以算作是此算法的一种实现,此算法一般不会重复,但是如果是统计的话,就有很大问题,特别是对域名相关的统计,就抓瞎了。
public class ShortUrlGenerator { /** * @param args */ public static void main(String[] args) { String sLongUrl = "http://474515923.qzone.qq.com" ; //长链接 String[] aResult = shortUrl (sLongUrl); // 打印出结果 for ( int i = 0; i < aResult. length ; i++) { System. 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 CMyEncrypt()).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 * 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; } }
跳转原理
当我们生成短链接之后,只需要在表中(数据库或者NoSql )存储原始链接与短链接的映射关系即可。当我们访问短链接时,只需要从映射关系中找到原始链接,即可跳转到原始链接。
附:控制长度?
package testjava; import java.util.HashMap; import java.util.Random; /* * URL Shortener */ public class URLShortener { // storage for generated keys private HashMap<String, String> keyMap; // key-url map private HashMap<String, String> valueMap;// url-key map to quickly check // whether an url is // already entered in our system private String domain; // Use this attribute to generate urls for a custom // domain name defaults to http://fkt.in private char myChars[]; // This array is used for character to number // mapping private Random myRand; // Random object used to generate random integers private int keyLength; // the key length in URL defaults to 8 // Default Constructor URLShortener() { keyMap = new HashMap<String, String>(); valueMap = new HashMap<String, String>(); myRand = new Random(); keyLength = 8; myChars = new char[62]; for (int i = 0; i < 62; i++) { int j = 0; if (i < 10) { j = i + 48; } else if (i > 9 && i <= 35) { j = i + 55; } else { j = i + 61; } myChars[i] = (char) j; } domain = "http://fkt.in"; } // Constructor which enables you to define tiny URL key length and base URL // name URLShortener(int length, String newDomain) { this(); this.keyLength = length; if (!newDomain.isEmpty()) { newDomain = sanitizeURL(newDomain); domain = newDomain; } } // shortenURL // the public method which can be called to shorten a given URL public String shortenURL(String longURL) { String shortURL = ""; if (validateURL(longURL)) { longURL = sanitizeURL(longURL); if (valueMap.containsKey(longURL)) { shortURL = domain + "/" + valueMap.get(longURL); } else { shortURL = domain + "/" + getKey(longURL); } } // add http part return shortURL; } // expandURL // public method which returns back the original URL given the shortened url public String expandURL(String shortURL) { String longURL = ""; String key = shortURL.substring(domain.length() + 1); longURL = keyMap.get(key); return longURL; } // Validate URL // not implemented, but should be implemented to check whether the given URL // is valid or not boolean validateURL(String url) { return true; } // sanitizeURL // This method should take care various issues with a valid url // e.g. www.google.com,www.google.com/, http://www.google.com, // http://www.google.com/ // all the above URL should point to same shortened URL // There could be several other cases like these. String sanitizeURL(String url) { if (url.substring(0, 7).equals("http://")) url = url.substring(7); if (url.substring(0, 8).equals("https://")) url = url.substring(8); if (url.charAt(url.length() - 1) == '/') url = url.substring(0, url.length() - 1); return url; } /* * Get Key method */ private String getKey(String longURL) { String key; key = generateKey(); keyMap.put(key, longURL); valueMap.put(longURL, key); return key; } // generateKey private String generateKey() { String key = ""; boolean flag = true; while (flag) { key = ""; for (int i = 0; i <= keyLength; i++) { key += myChars[myRand.nextInt(62)]; } // System.out.println("Iteration: "+ counter + "Key: "+ key); if (!keyMap.containsKey(key)) { flag = false; } } return key; } // test the code public static void main(String args[]) { URLShortener u = new URLShortener(5, "www.tinyurl.com/"); String urls[] = { "www.google.com/", "www.google.com", "http://www.yahoo.com", "www.yahoo.com/", "www.amazon.com", "www.amazon.com/page1.php", "www.amazon.com/page2.php", "www.flipkart.in", "www.rediff.com", "www.techmeme.com", "www.techcrunch.com", "www.lifehacker.com", "www.icicibank.com" }; for (int i = 0; i < urls.length; i++) { System.out.println("URL:" + urls[i] + "\tTiny: " + u.shortenURL(urls[i]) + "\tExpanded: " + u.expandURL(u.shortenURL(urls[i]))); } } }
相关文章推荐
- 微博URL短网址生成算法原理及(java版、php版实现实例)
- 微博URL短网址生成算法原理及(java版、php版实现实例)
- 微博URL短网址生成算法原理及(java版、php版实现实例)
- URL短网址生成算法原理和php实现案例
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- URL短地址压缩算法 微博短地址原理解析(再转与Java实现)
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- URL短网址生成算法原理
- scala---文档主题生成模型(LDA)算法原理及Spark MLlib调用实例(Scala/Java/python)
- ruby重写java对URL短地址压缩算法微博短地址原理解析
- php实现的生成迷宫与迷宫寻址算法完整实例
- Java随机数算法原理与实现方法实例详解
- 文档主题生成模型(LDA)算法原理及Spark MLlib调用实例(Scala/Java/python)
- 微博短网址生成算法原理 by cubeking