短地址(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))
end
local 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 do
local sub = string.sub(m, k*8+1, k*8+8)
local int = 0x3fffffff & tonumber(sub, 16)
local out = ''
for j=1,6 do
local v = ( 0x3d & int) + 1
out = out .. SHORT_BASE[v]
int = int >> 5
end
table.insert(ret, out)
end
return ret
end
local ret = short_url("hello world")
for k,v in pairs(ret) do
print("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))
end
local 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 do
local sub = string.sub(m, k*8+1, k*8+8)
local int = 0x3fffffff & tonumber(sub, 16)
local out = ''
for j=1,6 do
local v = ( 0x1f & int) + 1
out = out .. SHORT_BASE[v]
int = int >> 5
end
table.insert(ret, out)
end
return ret
end
local ret = short_url("hello world")
for k,v in pairs(ret) do
print("short_url", v)
end
结果如下:
参考:
http://blog.csdn.net/mycwq/article/details/52326266
分享到:
相关推荐
**luaQrcode:使用Lua语言生成二维码** 在IT行业中,二维码已经成为数据交换和信息展示的常见方式,尤其在移动设备上。luaQrcode是这样一个工具,它允许开发人员使用Lua编程语言来生成二维码,从而扩展了Lua的应用...
Lua 寻路算法是编程领域中用于解决游戏开发、路径规划等问题的一种技术。在游戏设计中,寻路算法常用于让角色或NPC自动找到从起点到终点的最佳路径。Lua 是一种轻量级的脚本语言,因其简洁的语法和易读性而广泛应用...
一个简单的lua脚本,生成gif图。图形是一个动态的
lua生成树代码,可以根据给定参数,生成树结构的数据,然后再加载到前台就可以了
### Nginx+Lua通过URL传参方式实现动态代理 #### 概述 在现代Web应用开发中,灵活地管理后端服务之间的通信是至关重要的。动态代理技术为这一需求提供了解决方案,使得前端可以方便地根据业务逻辑将请求转发至不同...
根据提供的信息,我们可以总结出以下关于“Lua编写的寻路算法”的相关知识点: ### Lua编写的寻路算法概述 此段代码实现了一个基于Lua语言的简单寻路算法。该算法适用于寻找从起点到终点的最短路径问题。通过深度...
ios版本将lua加密成luac
本项目“C++调用lua生成验证码图片”是一个简单的示例,它利用了这两种语言的优势,使得在C++的环境下,通过Lua脚本动态生成验证码图片。下面将详细解释这个项目的知识点。 首先,我们要理解C++和Lua的交互。Lua是...
在构建Lua动态库时,需要使用这个标志来确保生成的库可以在不同的地址空间被加载。 最后,“lua Makefile”表明包含了一个用于构建Lua项目的Makefile文件,这是一个自动化构建工具,根据其中的规则和指令,用户可以...
当前版本除了前面几个版本中更新的内容之外,还增加了宏 LUA_COMPAT_5_2 定义修改。 在源码包中,此宏定义在GCC中,打开lua-5.3.4/src/Makefile,可以看到:CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS...
2. **生成动态库**: Lua 可以被编译为动态链接库(.so 文件在 Linux 下),这样其他程序可以通过调用这些库来运行 Lua 脚本。编译过程通常涉及 `make` 命令,配置选项如 `make shared` 或 `make MYLUA=1`(如果使用...
本教程主要围绕"IOS使用lua动态生成类 dome"展开,讲解如何使用wax库来实现这一目标。 首先,我们要了解wax。Wax是将lua与Cocoa绑定的一个框架,它允许我们在lua中调用Objective-C的方法,同时也能够在Objective-C...
然后,编译源代码,生成lua.lib和lua.dll这两个关键文件。这些文件包含了Lua运行时所需的全部功能。 压缩包中的"Lib.rar"文件,很可能是经过编译后的库文件,包括静态库(.lib)和动态库(.dll),或者是编译好的可...
Lua脚本的斗地主的提示出牌算法。 包括: 查找某牌型的算法:查找所有的单牌,查找所有的对子,查找所有的三条,查找所有的单顺,双顺,飞机,飞机带单,飞机带双。 排序算法。 转成花色,转成点数, 比较算法等。
在描述中提到的“Usage: lua2exe myscript.lua”,这是一个命令行用法的例子,表明lua2exe是一个命令行工具,用户可以通过在终端或命令提示符中输入lua2exe命令,后面跟随他们想要编译的Lua脚本的名称(myscript.lua...
Lua是一种轻量级的脚本语言,常用于嵌入式系统和游戏开发。在这个压缩包中,我们有两个文件,"lua-5.2.4.tar.gz" 和 "Mylua-5.2.4.tar.gz",它们分别包含了 Lua 的标准库源代码和一个可能进行了定制的 Lua 版本。这...
它们的工作原理可能包括破译LUAC的加密算法,然后使用反编译技术将字节码转换为Lua源代码。 在压缩包中包含的"LUAC脚本解密"很可能是这样一个工具或者是一份关于如何进行LUAC解密的指南。使用这类工具时,需要了解...
lua json文件转换 数据编排 lua配置表转成 json配置表
这些工具通常会涉及到对Lua字节码格式的深入理解和字节码的解码算法。 在游戏开发中,lua的加密和反编译是一个常见的问题。游戏公司可能使用自定义的加密方法来保护其lua脚本,防止被玩家篡改或获取敏感信息。而lua...
Protocol Buffers是Google推出的一种数据序列化协议,它允许开发者定义数据结构,然后生成能够在各种语言中使用的代码,如C++, Java, Python等,同时也包括Lua。这种方式可以方便地进行数据交换和存储。 描述中提到...