转载:
比如这条微博:http://weibo.com/user/1713926427/zF4mOFpN7A
字符串为 zF4mOFpN7A
分组,从后往前4个字符一组,得到以下三组字符:
zF
4mOF
pN7A
这三组字符实际上是62进制表示的数值
62进制的字典是0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
按照字典把这三组字符转换成10进制,得到三组数字:
2211
1041021
6147026
拼起来,得出mid:221110410216147026
Java版:
public class WeiboID { public static class Base62Util { static String[] str62key = { "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", "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" }; /** * url转化成mid的值 * @param url * @return */ public static String url2mid(String url) { String mid = ""; String k = url.toString().substring(3, 4);//用于第四位为0时的转换 if (!k.equals("0")) { for (int i = url.length() - 4; i > -4; i = i - 4) {//分别以四个为一组 int offset1 = i < 0 ? 0 : i; int offset2 = i + 4; String str = url.toString().substring(offset1, offset2); str = str62to10(str);//String类型的转化成十进制的数 // 若不是第一组,则不足7位补0 if (offset1 > 0) { while (str.length() < 7) { str = '0' + str; } } mid = str + mid; } } else { for (int i = url.length() - 4; i > -4; i = i - 4) { int offset1 = i < 0 ? 0 : i; int offset2 = i + 4; if (offset1 > -1 && offset1 < 1 || offset1 > 4) { String str = url.toString().substring(offset1, offset2); str = str62to10(str); // 若不是第一组,则不足7位补0 if (offset1 > 0) { while (str.length() < 7) { str = '0' + str; } } mid = str + mid; } else { String str = url.toString().substring(offset1 + 1, offset2); str = str62to10(str); // 若不是第一组,则不足7位补0 if (offset1 > 0) { while (str.length() < 7) { str = '0' + str; } } mid = str + mid; } } } return mid; } /** * mid转换成url编码以后的值 * @param mid * @return */ public static String mid2url(String mid) { String url = ""; for (int j = mid.length() - 7; j > -7; j = j - 7) {//以7个数字为一个单位进行转换 int offset3 = j < 0 ? 0 : j; int offset4 = j + 7; // String l = mid.substring(mid.length() - 14, mid.length() - 13); if ((j > 0 && j < 6 ) && (mid.substring(mid.length() - 14, mid.length() - 13).equals("0")&& mid.length()==19)) { String num = mid.toString().substring(offset3 + 1, offset4); num = int10to62(Integer.valueOf(num));//十进制转换成62进制 url = 0 + num + url; if(url.length()==9 ){ url = url.substring(1, url.length()); } } else { String num = mid.toString().substring(offset3, offset4); num = int10to62(Integer.valueOf(num)); url = num + url; } } return url; } /** * 62进制转换成10进制 * @param str * @return */ public static String str62to10(String str) { String i10 = "0"; int c = 0; for (int i = 0; i < str.length(); i++) { int n = str.length() - i - 1; String s = str.substring(i, i + 1); for (int k = 0; k < str62key.length; k++) { if (s.equals(str62key[k])) { int h = k; c += (int) (h * Math.pow(62, n)); break; } } i10 = String.valueOf(c); } return i10; } /** * 10进制转换成62进制 * @param int10 * @return */ public static String int10to62(double int10) { String s62 = ""; int w = (int) int10; int r = 0; int a = 0; while (w != 0) { r = (int) (w % 62); s62 = str62key[r] + s62; a = (int) (w / 62); w = (int) Math.floor(a); } return s62; } public static void main(String[] args) throws Exception { String aa = url2mid("zeRxPdQhO"); System.out.println(aa); String bb = mid2url("3535424213299256"); System.out.println(bb); } } }
PhP版:mid转url
midToStr($mid); //mid转换为url地址后缀 function midToStr($mid) { settype($mid,'string'); $mid_length=strlen($mid); $url=''; $str=strrev($mid); $str=str_split($str,7); foreach($str as $v) { $url.=intTo62(strrev($v)); } $url_str=strrev($url); return $url_str; } function str62keys($key)//62进制字典 { $str62keys = array("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","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"); return $str62keys[$key]; } /* url 10 进制 转62进制*/ function intTo62($int10) { $s62 = ''; $r = 0; while ($int10 != 0) { $r = $int10 % 62; $s62.= str62keys($r); $int10 = floor($int10 / 62); } return $s62; }JS版:
var WeiboUtility = {}; /** * 62进制字典 */ WeiboUtility.str62keys = [ "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", "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" ]; /** * 62进制值转换为10进制 * @param {String} str62 62进制值 * @return {String} 10进制值 */ WeiboUtility.str62to10 = function(str62) { var i10 = 0; for (var i = 0; i < str62.length; i++) { var n = str62.length - i - 1; var s = str62[i]; i10 += this.str62keys.indexOf(s) * Math.pow(62, n); } return i10; }; /** * 10进制值转换为62进制 * @param {String} int10 10进制值 * @return {String} 62进制值 */ WeiboUtility.int10to62 = function(int10) { var s62 = ''; var r = 0; while (int10 != 0) { r = int10 % 62; s62 = this.str62keys[r] + s62; int10 = Math.floor(int10 / 62); } return s62; }; /** * URL字符转换为mid * @param {String} url 微博URL字符,如 "wr4mOFqpbO" * @return {String} 微博mid,如 "201110410216293360" */ WeiboUtility.url2mid = function(url) { var mid = ''; for (var i = url.length - 4; i > -4; i = i - 4) //从最后往前以4字节为一组读取URL字符 { var offset1 = i < 0 ? 0 : i; var offset2 = i + 4; var str = url.substring(offset1, offset2); str = this.str62to10(str); if (offset1 > 0) //若不是第一组,则不足7位补0 { while (str.length < 7) { str = '0' + str; } } mid = str + mid; } return mid; }; /** * mid转换为URL字符 * @param {String} mid 微博mid,如 "201110410216293360" * @return {String} 微博URL字符,如 "wr4mOFqpbO" */ WeiboUtility.mid2url = function(mid) { if (typeof(mid) != 'string') return false; //mid数值较大,必须为字符串! var url = ''; for (var i = mid.length - 7; i > -7; i = i - 7) //从最后往前以7字节为一组读取mid { var offset1 = i < 0 ? 0 : i; var offset2 = i + 7; var num = mid.substring(offset1, offset2); num = this.int10to62(num); url = num + url; } return url; };