`
cwqcwk1
  • 浏览: 87242 次
文章分类
社区版块
存档分类
最新评论

微博URL短地址lua生成算法

 
阅读更多
短地址(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语言生成二维码

    **luaQrcode:使用Lua语言生成二维码** 在IT行业中,二维码已经成为数据交换和信息展示的常见方式,尤其在移动设备上。luaQrcode是这样一个工具,它允许开发人员使用Lua编程语言来生成二维码,从而扩展了Lua的应用...

    lua 寻路算法

    Lua 寻路算法是编程领域中用于解决游戏开发、路径规划等问题的一种技术。在游戏设计中,寻路算法常用于让角色或NPC自动找到从起点到终点的最佳路径。Lua 是一种轻量级的脚本语言,因其简洁的语法和易读性而广泛应用...

    lua生成gif图例子

    一个简单的lua脚本,生成gif图。图形是一个动态的

    lua生成树代码

    lua生成树代码,可以根据给定参数,生成树结构的数据,然后再加载到前台就可以了

    Nginx+lua通过url传参的方式实现动态代理

    ### Nginx+Lua通过URL传参方式实现动态代理 #### 概述 在现代Web应用开发中,灵活地管理后端服务之间的通信是至关重要的。动态代理技术为这一需求提供了解决方案,使得前端可以方便地根据业务逻辑将请求转发至不同...

    lua写的寻路算法

    根据提供的信息,我们可以总结出以下关于“Lua编写的寻路算法”的相关知识点: ### Lua编写的寻路算法概述 此段代码实现了一个基于Lua语言的简单寻路算法。该算法适用于寻找从起点到终点的最短路径问题。通过深度...

    lua加密成luac工具

    ios版本将lua加密成luac

    C++调用lua生成验证码图片

    本项目“C++调用lua生成验证码图片”是一个简单的示例,它利用了这两种语言的优势,使得在C++的环境下,通过Lua脚本动态生成验证码图片。下面将详细解释这个项目的知识点。 首先,我们要理解C++和Lua的交互。Lua是...

    lua-5.1.tar.gz Mylua-5.1.tar.gz lua生成动态库 lua包管理 pkgconfig PKG_CONFIG_PATH

    在构建Lua动态库时,需要使用这个标志来确保生成的库可以在不同的地址空间被加载。 最后,“lua Makefile”表明包含了一个用于构建Lua项目的Makefile文件,这是一个自动化构建工具,根据其中的规则和指令,用户可以...

    lua-5.3.4.tar.gz Mylua-5.3.4.tar.gz lua生成动态库 lua包管理 pkgconfig PKG_CONFIG_PATH

    当前版本除了前面几个版本中更新的内容之外,还增加了宏 LUA_COMPAT_5_2 定义修改。 在源码包中,此宏定义在GCC中,打开lua-5.3.4/src/Makefile,可以看到:CFLAGS= -O2 -Wall -Wextra -DLUA_COMPAT_5_2 $(SYSCFLAGS...

    lua-5.3.tar.gz Mylua-5.3.tar.gz lua生成动态库 lua包管理 pkgconfig PKG_CONFIG_PATH

    2. **生成动态库**: Lua 可以被编译为动态链接库(.so 文件在 Linux 下),这样其他程序可以通过调用这些库来运行 Lua 脚本。编译过程通常涉及 `make` 命令,配置选项如 `make shared` 或 `make MYLUA=1`(如果使用...

    IOS使用lua动态生成类 dome

    本教程主要围绕"IOS使用lua动态生成类 dome"展开,讲解如何使用wax库来实现这一目标。 首先,我们要了解wax。Wax是将lua与Cocoa绑定的一个框架,它允许我们在lua中调用Objective-C的方法,同时也能够在Objective-C...

    Lib.rar 根据Lua 5.1.4 生成的库

    然后,编译源代码,生成lua.lib和lua.dll这两个关键文件。这些文件包含了Lua运行时所需的全部功能。 压缩包中的"Lib.rar"文件,很可能是经过编译后的库文件,包括静态库(.lib)和动态库(.dll),或者是编译好的可...

    Lua脚本的斗地主的提示出牌算法。

    Lua脚本的斗地主的提示出牌算法。 包括: 查找某牌型的算法:查找所有的单牌,查找所有的对子,查找所有的三条,查找所有的单顺,双顺,飞机,飞机带单,飞机带双。 排序算法。 转成花色,转成点数, 比较算法等。

    Lua编译成exe的工具

    在描述中提到的“Usage: lua2exe myscript.lua”,这是一个命令行用法的例子,表明lua2exe是一个命令行工具,用户可以通过在终端或命令提示符中输入lua2exe命令,后面跟随他们想要编译的Lua脚本的名称(myscript.lua...

    lua-5.2.4.tar.gz Mylua-5.2.4.tar.gz lua生成动态库 lua包管理 pkgconfig PKG_CONFIG_PATH

    Lua是一种轻量级的脚本语言,常用于嵌入式系统和游戏开发。在这个压缩包中,我们有两个文件,"lua-5.2.4.tar.gz" 和 "Mylua-5.2.4.tar.gz",它们分别包含了 Lua 的标准库源代码和一个可能进行了定制的 Lua 版本。这...

    LUAC脚本解密_luac解密在线_luac4加密_luac反编译_luac4解密工具_luac解密工具

    它们的工作原理可能包括破译LUAC的加密算法,然后使用反编译技术将字节码转换为Lua源代码。 在压缩包中包含的"LUAC脚本解密"很可能是这样一个工具或者是一份关于如何进行LUAC解密的指南。使用这类工具时,需要了解...

    lua文本转成json文本

    lua json文件转换 数据编排 lua配置表转成 json配置表

    LUAC反编译_LUC_lua反编译工具_luac_luac解密工具_Lua解密_

    这些工具通常会涉及到对Lua字节码格式的深入理解和字节码的解码算法。 在游戏开发中,lua的加密和反编译是一个常见的问题。游戏公司可能使用自定义的加密方法来保护其lua脚本,防止被玩家篡改或获取敏感信息。而lua...

    protobuf转为lua代码

    Protocol Buffers是Google推出的一种数据序列化协议,它允许开发者定义数据结构,然后生成能够在各种语言中使用的代码,如C++, Java, Python等,同时也包括Lua。这种方式可以方便地进行数据交换和存储。 描述中提到...

Global site tag (gtag.js) - Google Analytics