假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的URL都非常短例如: http://t.cn/E70Piib, 我们应该都能想到链接中的E70Piib对应的就是存储长链接地址的数据记录的ID,可是这个有大小写字母和数字构成的唯一ID是怎么生成的呢,刚学编程的时候我们用的方法都试拼接一个足够唯一的字符串(比如时间戳加用户ID等等)然后再用MD5或者SHA1散列算法算出一个散列值,用这种方法得到的唯一ID有可能比原始的链接的长度还要长,所以如何来优雅的生成足够短的字符串唯一ID呢?

我们先来看一个数学问题,普通的数字ID是用十进制来表示的,在十进制中每位都有10种可能(0-9),所以5位的十进制数能呈现最多10 * 10 * 10 * 10 * 10 = 100,000个ID。

现在如果用32进制来表达一个5位数字需要多少位呢?

echo base_convert(10000, 10, 32); //答案是 '90g'

32进制是数字和一些小些字母来组成,所以5位32进制可表达的唯一ID有 32 * 32 * 32 * 32 * 32 = 33,554,432个,数量已经很大了。

使用32进制也能生成比较短的字符串唯一ID,不过还有更好的解决方案,你也看到了上面短链接的唯一ID里还包含大写字母。

接下来我们使用62进制转换,将一个十进制数字转化为对应的62进制表示。

(为什么用62进制?数字加大小写字母一共是62个)

常用的这几个编程语言里没有提供62进制的转换,所以就需要我们自己写一个函数来进行10进制到62进制的转换。

/**

* Convert a numeric string from base 10 to another base.

*

* @param $value decimal string

* @param int $b base , max is 62

* @return string

*/

function to_base($value, $b = 62)

{

$base = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';

$r = $value % $b;

$result = $base[$r];

$q = floor($value / $b);

while ($q)

{

$r = $q % $b;

$q = floor($q / $b);

$result = $base[$r].$result;

}

return $result;

}

/**

* Convert a 10 base numeric string to a 62 base string

*

* @param int $value

* @return string

*/

function base62_encode($value)

{

return to_base($value, 62);

}

定义好上面的函数后,让我们将100,000,000 转换成62进制试一试:

echo base62_encode(100000000); //结果是6LAze

理解了将十进制正整数转换成62进制的字符串表示形式的原理后,在任何编程语言里都可以很轻松地实现一个转换函数,下面再提供一个Python版本的Base62.encode

#!/usr/bin/python

# -*- coding=UTF-8 -*-

from __future__ import print_function, division

BASE62 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

def encode(num, alphabet=BASE62):

"""Encode a positive number in Base X

Arguments:

- `num`: The number to encode

- `alphabet`: The alphabet to use for encoding

"""

if num == 0:

return alphabet[0]

arr = []

base = len(alphabet)

while num:

num, rem = divmod(num, base)

arr.append(alphabet[rem])

arr.reverse()

return ''.join(arr)

Python函数注解

python的divmod函数用第一个参数num除以第二个参数base,并以元组的形式返回商和余数。

因为divmod返回两个元素构成的元组,在python中元组可以简写省略两边地括号,所以num, rem = divmod(num, base)是一个元组赋值表达式,并不是divmod函数返回了两个返回值。

一亿用62进制表示出来后的结果是6LAze , 生成的唯一字符串ID足够短。短链接只是一个应用场景,base62还可以应用到很多需要表示唯一ID的地方,这样一来你就不用再使用那些哈希算法来生成那么冗长的字符串了,虽然只是节省了一些空间但是这在高访问量的URL和海量数据的存储中还是能省下来不少资源的。

php传递字符串给python,用PHP和Python生成短链接服务的字符串ID相关推荐

  1. 用PHP和Python生成短链接服务的字符串ID

    假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的URL都非常短例如: http://t.cn/E70Piib, 我们应该都能想到链接中的E70Piib对应的就是存储长链接地址的数据记录的I ...

  2. 利用Python打造短链接服务

    有时候我们需要推广的链接太长不利于我们去推广,这时候我们就需要用到短链接服务. 目前国内有很多家网站提供网站缩短服务,比如腾讯家的http://t.im.微博家的http://t.cn.百度家的htt ...

  3. java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串...

    java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 1 package com.zdz.test; ...

  4. [转载] python 短网址_使用Python生成url短链接的方法

    参考链接: URL 短地址Shorteners及其Python中的API 1 用PHP和Python生成短链接服务的字符串ID 假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的URL都非常 ...

  5. python 短网址_使用Python生成url短链接的方法

    用PHP和Python生成短链接服务的字符串ID 假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的URL都非常短例如: http://t.cn/E70Piib, 我们应该都能想到链接中的E ...

  6. 新浪短链接传递多个参数的正确写法

    使用新浪短链接有多个参数一定要注意将&符号写成%26,不然你传递的参数&符号开始的部分会丢失.如www.baidu.com?a=1&b=2 生成短链接后,打开的url只会是ww ...

  7. python统计字符在文件中出现的次数_python字符串中字符出现次数(python获取字符串个数)...

    今天要说的是Python的字符串函数还是很方便的,只需要调用 count() 方法即可. 最近,我在一个网站上看到了一个自然语言处理课程.我详细解释了一些方法的使用,用例很容易理解,所以我想通过我的博 ...

  8. Python 第二篇:python字符串、列表和字典的基本操作方法

    本文基于python 3.5.1 python常见的数据类型有字串.列表.元组.字典等,本文将详细介绍每一种数据类型的操作方法. 一:str字串的操作方法: 1.capitalize()-->  ...

  9. python中find函数的使用方法_Python教程-String 字符串使用教程

    Python 语言中的String 在Python中,String代指以下特点: 代表Unicode字符的字节数组 用单引号或双引号引起来 无限长度 Python 中 String 字符串定义方式 $ ...

最新文章

  1. 2021牛客暑期多校训练营3 I-Kuriyama Mirai and Exclusive Or (差分+位运算)
  2. 跟我一起学extjs5(05--主界面上增加顶部和底部区域)
  3. matplotlib散点图,圆
  4. php上传文件后无法移动到指定目录的解决
  5. yum错误---Running Transaction
  6. linux crontab怎么写,linux定时任务crontab
  7. python复制sheet_python excel sheet复制
  8. oci连接mysql_OCILIB 连接Oracle数据库——插入数据
  9. Spring+SpringMVC+Mybatis框架搭建
  10. 微信小程序独家秘笈之左滑删除
  11. 计算机与材料物理,南京邮电大学材料物理专业
  12. 树莓派使用433Mhz射频无线收发
  13. 在PyG上构建自己的数据集
  14. 中文分词器ICTCLAS使用方法(Java)
  15. 无效的月份oracle,Oracle插入失败:无效的月份
  16. 2021-04-29 Do not nest ternary expressions
  17. TextTranslatorOpenSource-文本翻译器开源版
  18. [HDU-2115] I Love This Game结构体排序典型应用
  19. 408数据结构学习笔记-树-①树的逻辑结构
  20. 新手项目经理入坑指南

热门文章

  1. 【转】oracle数据库中varchar2陷阱
  2. spring AspectJ的Execution表达式
  3. wndows程序设计之书籍知识与代码摘录-封装一个类似printf的messagebox
  4. IT信息业、金融业从业人员悲歌
  5. Linux 30岁了~我们也老了
  6. 人大计算机在职考研好考吗,人大在职研究生好考吗?通过率高吗?
  7. java loadlibrary_java – System.loadLibrary不起作用.链中的第二个lib的UnsatisfiedLinkError...
  8. void函数调用时显示不允许使用不完整的_4位数码管显示模块驱动
  9. mysql 根据当前时间戳_mysql timestamp类型 根据当前时间戳更新
  10. fastapi PUT更新数据 / PATCH部分更新