最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

短URL生成转换

来源:懂视网 责编:小采 时间:2020-11-27 14:27:22
文档

短URL生成转换

短URL生成转换:主要逻辑:1, 确定一个包括大小写字母、数据的字符串LS,长度为 L = 26+26+10 = 622, 初始化L**N个整数,并作为一个序列push到redis里3, 当需要转换一个长URL时,先从以上的序列中随机pop出一个整数I4, 对整数I取模(除数为L),余数对应到LS的一个字母,
推荐度:
导读短URL生成转换:主要逻辑:1, 确定一个包括大小写字母、数据的字符串LS,长度为 L = 26+26+10 = 622, 初始化L**N个整数,并作为一个序列push到redis里3, 当需要转换一个长URL时,先从以上的序列中随机pop出一个整数I4, 对整数I取模(除数为L),余数对应到LS的一个字母,

主要逻辑:

1, 确定一个包括大小写字母、数据的字符串LS,长度为 L = 26+26+10 = 62

2, 初始化L**N个整数,并作为一个序列push到redis里

3, 当需要转换一个长URL时,先从以上的序列中随机pop出一个整数I

4, 对整数I取模(除数为L),余数对应到LS的一个字母,取完模后再除以L取整,当结果等于0时停止除模,否则结果继续取模。

5, 将所有余数对应的字母按顺序排列得到一个简短的字符串SS

6, 将长URL的md5哈希值作为KEY,将字符串SS作为VALUE,写入redis

7, 将字符串SS作为KEY, 将长URL作为VALUE,写入redis

8, 将前缀(短url域名)加上字符串SS,作为短URL结果返回

9, 当用户使用短url访问时,将短URL中的字符串SS取出,并作为KEY从redis中取出长URL,跳转长URL

注意:

当redis中序列数字快使用完时,要及时增加(可以写个脚本随时监控,数量少于10%时就自动增加数量),切忌不能存已经用过的数字

#encoding=utf-8
import string
import redis
import hashlib
LETTERS = string.digits + string.ascii_letters
LETTERS_NUM = len(LETTERS)
COUNTER_KEY = 'url:counter'
def init(rd,num):
 for i in xrange(LETTERS_NUM * num):
 rd.sadd('url:id:set',i)
#通过urlid取得短url对应的字符串
def get_url(urlid):
 result = []
 q = urlid/LETTERS_NUM
 r = urlid%LETTERS_NUM
 result.append(LETTERS[r])
 while q:
 r = q%LETTERS_NUM
 q = q/LETTERS_NUM
 result = [LETTERS[r]] + result
 return ''.join(result)
#得到短url字符串
def parse_url(rd, longurl):
 ret = longurl
 if (longurl.startswith("http://") or longurl.startswith("https://")) and len(longurl)>7: 
 m = hashlib.md5()
 m.update(longurl)
 urlkey = m.digest()
 old_param = rd.get(urlkey)
 if old_param: 
 ret = old_param
 else:
 urlid = int(rd.spop('url:id:set'))
 param = get_url(urlid)
 rd.incr(COUNTER_KEY, 1)
 rd.set(param,longurl)
 rd.set(urlkey,param)
 ret = param 
 print "short url:",ret
 return ret
if __name__ == "__main__":
 url = "http://www.google.com/"
 rd = redis.Redis('127.0.0.1',6379,db=0)
 init(rd,3)
 parse_url(rd,url)

文档

短URL生成转换

短URL生成转换:主要逻辑:1, 确定一个包括大小写字母、数据的字符串LS,长度为 L = 26+26+10 = 622, 初始化L**N个整数,并作为一个序列push到redis里3, 当需要转换一个长URL时,先从以上的序列中随机pop出一个整数I4, 对整数I取模(除数为L),余数对应到LS的一个字母,
推荐度:
标签: 转换 链接 生成
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top