php传递字符串给python,用PHP和Python生成短链接服务的字符串ID
假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的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相关推荐
- 用PHP和Python生成短链接服务的字符串ID
假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的URL都非常短例如: http://t.cn/E70Piib, 我们应该都能想到链接中的E70Piib对应的就是存储长链接地址的数据记录的I ...
- 利用Python打造短链接服务
有时候我们需要推广的链接太长不利于我们去推广,这时候我们就需要用到短链接服务. 目前国内有很多家网站提供网站缩短服务,比如腾讯家的http://t.im.微博家的http://t.cn.百度家的htt ...
- java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串...
java,url长链接生成短链接,短链接生成器,自定义字符串,对字符串md5混合KEY加密,根据短链接获得key值,不重复的随机数,不重复的随机字符串 1 package com.zdz.test; ...
- [转载] python 短网址_使用Python生成url短链接的方法
参考链接: URL 短地址Shorteners及其Python中的API 1 用PHP和Python生成短链接服务的字符串ID 假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的URL都非常 ...
- python 短网址_使用Python生成url短链接的方法
用PHP和Python生成短链接服务的字符串ID 假设你想做一个像微博短链接那样的短链接服务,短链接服务生成的URL都非常短例如: http://t.cn/E70Piib, 我们应该都能想到链接中的E ...
- 新浪短链接传递多个参数的正确写法
使用新浪短链接有多个参数一定要注意将&符号写成%26,不然你传递的参数&符号开始的部分会丢失.如www.baidu.com?a=1&b=2 生成短链接后,打开的url只会是ww ...
- python统计字符在文件中出现的次数_python字符串中字符出现次数(python获取字符串个数)...
今天要说的是Python的字符串函数还是很方便的,只需要调用 count() 方法即可. 最近,我在一个网站上看到了一个自然语言处理课程.我详细解释了一些方法的使用,用例很容易理解,所以我想通过我的博 ...
- Python 第二篇:python字符串、列表和字典的基本操作方法
本文基于python 3.5.1 python常见的数据类型有字串.列表.元组.字典等,本文将详细介绍每一种数据类型的操作方法. 一:str字串的操作方法: 1.capitalize()--> ...
- python中find函数的使用方法_Python教程-String 字符串使用教程
Python 语言中的String 在Python中,String代指以下特点: 代表Unicode字符的字节数组 用单引号或双引号引起来 无限长度 Python 中 String 字符串定义方式 $ ...
最新文章
- 2021牛客暑期多校训练营3 I-Kuriyama Mirai and Exclusive Or (差分+位运算)
- 跟我一起学extjs5(05--主界面上增加顶部和底部区域)
- matplotlib散点图,圆
- php上传文件后无法移动到指定目录的解决
- yum错误---Running Transaction
- linux crontab怎么写,linux定时任务crontab
- python复制sheet_python excel sheet复制
- oci连接mysql_OCILIB 连接Oracle数据库——插入数据
- Spring+SpringMVC+Mybatis框架搭建
- 微信小程序独家秘笈之左滑删除
- 计算机与材料物理,南京邮电大学材料物理专业
- 树莓派使用433Mhz射频无线收发
- 在PyG上构建自己的数据集
- 中文分词器ICTCLAS使用方法(Java)
- 无效的月份oracle,Oracle插入失败:无效的月份
- 2021-04-29 Do not nest ternary expressions
- TextTranslatorOpenSource-文本翻译器开源版
- [HDU-2115] I Love This Game结构体排序典型应用
- 408数据结构学习笔记-树-①树的逻辑结构
- 新手项目经理入坑指南
热门文章
- 【转】oracle数据库中varchar2陷阱
- spring AspectJ的Execution表达式
- wndows程序设计之书籍知识与代码摘录-封装一个类似printf的messagebox
- IT信息业、金融业从业人员悲歌
- Linux 30岁了~我们也老了
- 人大计算机在职考研好考吗,人大在职研究生好考吗?通过率高吗?
- java loadlibrary_java – System.loadLibrary不起作用.链中的第二个lib的UnsatisfiedLinkError...
- void函数调用时显示不允许使用不完整的_4位数码管显示模块驱动
- mysql 根据当前时间戳_mysql timestamp类型 根据当前时间戳更新
- fastapi PUT更新数据 / PATCH部分更新