短网址生成(高进制数字转换)
时间:2010-07-03
来源:互联网
这里不免俗的也说一下直接由自增序列来生产短网址的方法。
使用六十二进制将十进制数字变“短”。
例如数据库中第 56800235583 条信息,对应的短网址后缀可以是 ZZZZZZ 。
下面是存储示例:
id 自增序列/自增编号
url 目标链接
*suffix* 短网址后缀 (并不需要存储在数据库内)
- +------------+-----------------------+---------+
- |id | url | *suffix*|
- +------------+-----------------------+---------+
- |123456 | http://zoeey.com/ | w7e |
- +------------+-----------------------+---------+
- |123457 | http://www.zoeey.com/ | w7f |
- +------------+-----------------------+---------+
- |56800235582 | http://zoeey.org/ | ZZZZZY |
- +------------+-----------------------+---------+
- |56800235583 | http://www.zoeey.org/ | ZZZZZZ |
- +------------+-----------------------+---------+
- 提交网址存储后获取其编号 如:123456
- 用dec2Any将编号转换为62进制,并拼接网址 如:http://go.to/w7e
- 用户访问到 http://go.to/w7e 时,提取短网址后缀 w7e
- 用any2Dec将短网址后缀转换为10进制,得到链接编号 如:123456
- 使用编号查询链接,并进行跳转
下面是进制转换所需要的源码:
- /*
- * MoXie ([email protected]) 2010-6-30 17:53:57
- *
- * Copyright © 2008-2010 Zoeey.Org . All rights are reserved.
- * Code license: Apache License Version 2.0
- * http://www.apache.org/licenses/LICENSE-2.0.txt
- */
- error_reporting(E_ALL);
-
- /**
- * 返回一字符串,十进制 number 以 radix 进制的表示。
- * @param dec 需要转换的数字
- * @param toRadix 输出进制。当不在转换范围内时,此参数会被设定为 2,以便及时发现。
- * @return 指定输出进制的数字
- */
- function dec2Any($dec, $toRadix) {
- $MIN_RADIX = 2;
- $MAX_RADIX = 62;
- $num62 = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
- if ($toRadix < $MIN_RADIX || $toRadix > $MAX_RADIX) {
- $toRadix = 2;
- }
- if ($toRadix == 10) {
- return $dec;
- }
- // -Long.MIN_VALUE 转换为 2 进制时长度为65
- $buf = array();
- $charPos = 64;
- $isNegative = $dec < 0; //(bccomp($dec, 0) < 0);
- if (!$isNegative) {
- $dec = -$dec; // bcsub(0, $dec);
- }
-
- while (bccomp($dec, -$toRadix) <= 0) {
- $buf[$charPos--] = $num62[-bcmod($dec, $toRadix)];
- $dec = bcdiv($dec, $toRadix);
- }
- $buf[$charPos] = $num62[-$dec];
- if ($isNegative) {
- $buf[--$charPos] = '-';
- }
- $_any = '';
- for ($i = $charPos; $i < 65; $i++) {
- $_any .= $buf[$i];
- }
- return $_any;
- }
-
- /**
- * 返回一字符串,包含 number 以 10 进制的表示。<br />
- * fromBase 只能在 2 和 62 之间(包括 2 和 62)。
- * @param number 输入数字
- * @param fromRadix 输入进制
- * @return 十进制数字
- */
- function any2Dec($number, $fromRadix) {
- $num62 = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
- $dec = 0;
- $digitValue = 0;
- $len = strlen($number) - 1;
- for ($t = 0; $t <= $len; $t++) {
- $digitValue = strpos($num62, $number[$t]);
- $dec = bcadd(bcmul($dec, $fromRadix), $digitValue);
- }
- return $dec;
- }
-
- $sol = '<br />' . PHP_EOL;
- echo dec2Any('56800235583', 62), $sol; // ZZZZZZ
- echo any2Dec('ZZZZZZ', 62), $sol; // 56800235583
- echo dec2Any('123456', 62), $sol; // w7e
- echo any2Dec('w7e', 62), $sol; // 123456
Zoeey/NumberHelper.java
原帖:
http://www.zoeey.com/2010/06/30/short-url-radix-convert/
作者: SysTem128 发布时间: 2010-07-03

作者: qxhy123 发布时间: 2010-07-03
作者: 如惈 发布时间: 2010-07-03
作者: muzifeng 发布时间: 2010-07-03
作者: qxhy123 发布时间: 2010-07-03
作者: TankMe 发布时间: 2010-07-03
作者: fkj 发布时间: 2010-07-03
作者: hack7755 发布时间: 2010-07-28
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28