微博URL短地址lua生成算法
来源:互联网 发布:qq飞车淘宝刷徒弟流程 编辑:程序博客网 时间:2024/05/01 00:36
短地址(Short URL),或叫短网址、短链接等等,就是比较短的URL地址。借助短地址,可以将原来冗长的网址替换成简短的网址,让使用者可以更容易分享链接。在Web 2.0的今天,不得不说,这是一个潮流(我喜欢这句话,就原封不动从别人文章复制过来了)。
例如:http://t.cn/pQ8LLW
短地址,主要应用场景是微博。微博消息限制字数为140字,如果要发一些链接,这个网址可能占用一半字数了,所以短地址就应运而生。
短地址的生成算法有很多种,这里取其中一种做实现。无论哪种算法都不能避免重复,所以要结合数据库对网址和短地址做映射。
结合MD5的实现算法:
1. 将网址md5后生成32位串,分4段, 每段8字节
2. 对这四段循环处理,和0x3FFFFFFF与运算,即保留30位数据
3. 根据字母表长度取索引值,如a-zA-Z0-9,就有62位,取0x3D (下标从0开始)
4. 将前面的30位数据分成6段,每5位再和0x3D与运算,算得字母表下标,取到6位字符串
这种算法,会生成4个6位字符串。
lua版的算法如下:
local md5 = require "md5.core"function md5.sumhexa(k)k = md5.sum(k)return (string.gsub(k, ".", function (c)return string.format("%02x", string.byte(c))end))endlocal SHORT_BASE = {"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"}local SHORT_PRE = "short_pre"function short_url(str)local m = md5.sumhexa(SHORT_PRE..str)local ret = {}for k=0,3 dolocal sub = string.sub(m, k*8+1, k*8+8)local int = 0x3fffffff & tonumber(sub, 16)local out = ''for j=1,6 dolocal v = ( 0x3d & int) + 1out = out .. SHORT_BASE[v]int = int >> 5endtable.insert(ret, out)endreturn retendlocal ret = short_url("hello world")for k,v in pairs(ret) doprint("short_url", v)end
注意了,lua比较特殊,数组下标从1开始。结果如下:
另外,再提供可让用户输入的短地址版本。就是只保留大写字母和数字,同时去掉了容易混淆的O0I1 。算法类似,可做激活码。
local md5 = require "md5.core"function md5.sumhexa(k)k = md5.sum(k)return (string.gsub(k, ".", function (c)return string.format("%02x", string.byte(c))end))endlocal SHORT_BASE = {'A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z','2','3','4','5','6','7','8','9',}local SHORT_PRE = "short_pre"function short_url(str)local m = md5.sumhexa(SHORT_PRE..str)local ret = {}for k=0,3 dolocal sub = string.sub(m, k*8+1, k*8+8)local int = 0x3fffffff & tonumber(sub, 16)local out = ''for j=1,6 dolocal v = ( 0x1f & int) + 1out = out .. SHORT_BASE[v]int = int >> 5endtable.insert(ret, out)endreturn retendlocal ret = short_url("hello world")for k,v in pairs(ret) doprint("short_url", v)end结果如下:
参考:
http://blog.csdn.net/mycwq/article/details/52326266
1 0
- 微博URL短地址lua生成算法
- URL短地址压缩算法
- Java学习 - URL短地址压缩算法
- URL短地址压缩算法-短网址映射
- URL短网址生成算法原理
- URL短地址压缩算法 微博短地址原理解析
- URL短地址压缩算法 微博短地址原理解析
- URL短地址压缩算法 微博短地址原理解析
- URL短地址压缩算法 微博短地址原理解析
- 算法 —— URL短地址压缩算法
- 短码生成算法及url二维码生成
- 短URL生成转换
- 【转】微博URL短网址生成算法原理及(java版、php版实现实例)
- 微博URL短网址生成算法原理及(java版、php版实现实例)
- 生成短地址
- C# URL短地址压缩算法及短网址原理解析
- 短地址,短URL服务 - 百度,TinyURL
- URL短地址压缩算法 微博短地址原理解析 (Java实现)
- 一个简单多任务内核编译和运行
- 17种常用的JS正则表达式 非负浮点数 非负正数.
- java基础学习总结——super的几种用法并与this的区别
- 64位系统使用Access 数据库文件遇到的错误和解决办法
- ANdroid mvp 模式 优秀的学习demo
- 微博URL短地址lua生成算法
- Windows下Node.js的安装与使用
- ecshop二次开发--广告投放
- 批处理备份及删除,forfiles命令详解
- 使用vim分割窗口时如何改变窗口的尺寸
- linux使用---2.linux使用记录2
- hdu4276 The Ghost Blows Light(树型dp)
- 51Nod Problem 1102 面积最大的矩形(DP)
- 图片的展示