• 36进制 PHP


    短网址服务就是把长的URL地址转换成短的URL。如google提供的http://goo.gl/

    短网址 http://goo.gl/mwsQP 对应的网址就是 http://www.cnblogs.com/zjfree

    短网址参考:http://baike.baidu.com/view/2693499.htm

    那为什么URL那么多怎么就可以使用5位字符就表示呢? 注意短网址后面的5位字符是区分大小写的。

    如果五个字符是(0-9)、(A-Z)、(a-z),那5位字符可以穷举多个呢?62^5 = 916132832个 如果6位呢?62^6 = 56800235584个 500多亿个网址。

    这实际上是一个62进制的数字!那么在现实的应用中经常有缩短业务单号的需求,为什么不使用这种办法呢?为了方便输入我们不区分大小写。

    我们使用(0-9)、(A-Z) 这样就得到了一个36进制的数字。它能表示多少信息呢?

    进制说明

    10进制是 0-9 (0123456789)
    16进制是 0-F (0123456789ABCDEF)
    36进制是 0-F (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ)

    信息量计算 多少位就是36的多少次方。

    1位时 36^1 = 36
    2位时 36^2 = 1296
    3位时 36^3 = 46656
    4位时 36^4 = 1679616
    5位时 36^5 = 60466176
    6位时 36^6 = 2176782336
    7位时 36^7 = 78364164096

    10进制和36进制互转代码

    /// <summary>
    /// Convert36 的摘要说明
    /// </summary>
    public class Convert36
    {
    	public Convert36()
    	{
    		//
    		// TODO: 在此处添加构造函数逻辑
    		//
    	}
    
    	private const string BASE_CHAR = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    	/// <summary>
    	/// 转换为段字符
    	/// </summary>
    	/// <param name="num"></param>
    	/// <param name="length"></param>
    	/// <returns></returns>
    	public static string GetShortNo(int num, int length)
    	{
    		string str = "";
    		while (num > 0)
    		{
    			int cur = num % BASE_CHAR.Length;
    			str = BASE_CHAR[cur] + str;
    			num = num / BASE_CHAR.Length;
    		}
    		if (str.Length > length)
    		{
    			str = str.Substring(str.Length - length);
    		}
    		else
    		{
    			str = str.PadLeft(length, '0');
    		}
    
    		return str;
    	}
    
    	/// <summary>
    	/// 解析段字符
    	/// </summary>
    	/// <param name="strNo"></param>
    	/// <returns></returns>
    	public static int GetShortNum(string strNo)
    	{
    		int num = 0;
    		for (int i = 0; i < strNo.Length; i++)
    		{
    			num += BASE_CHAR.IndexOf(strNo[i]) * (int)Math.Pow(BASE_CHAR.Length, strNo.Length - i - 1);
    		}
    
    		return num;
    	}
    }
    

    实例分析

    原订单号组成规则 1010101001 {年}{月}{日}{一天流水号} 长度为10位 它可表示00-00-00 到 99-12-31 (100年 约36500天)的时间 和一天内9999个订单不重复

    而使用36进制 {前3位表示日期}{后三位表示流水号} 长度6位 可表示46656天(约128年) 46656个流水号


    欢迎转载,转载请注明:转载自[ http://www.cnblogs.com/zjfree/ ]
  • 相关阅读:
    C#跨平台开源项目实战(WPF/Android/IOS/Blazor)
    WPF应用程序关闭模式(ShutdownMode)
    git修改提交记录的用户信息
    WPF摄像头使用(AForge)
    VisualStudio AppCenter 应用介绍
    EntityFrameworkCore 工具命令行总结
    FILEtoJPG-神秘文件 -更新(软件BUG及建议可以在这里反馈)
    开启网赚新方法:微信小号挂机-每天赚个早饭钱
    Android 7.0 以上保留数据去除锁屏密码的方法
    使用 GitHub+Hexo 搭建个人博客
  • 原文地址:https://www.cnblogs.com/zjfree/p/2266177.html
Copyright © 2020-2023  润新知