将int,bigint整型数值可逆转换字符串
将 Int 和 BigInt 类型数值转换为字符串的可逆方法,可用于缩短网址或记录的ID转换等。
如: 9223372036854775807 => aZl8N0y58M7
class Convert
{
/**
* 默认密钥字符串
* @var string
*/
const KEY = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
/**
* 将 Int 类型十进制数值转换为指定进制编码
* @param int|string $num 取值范围 0 ~ 2147483647 之间
* @return string
*/
public static function encodeInt($num) {
$str = '';
if ($num <= 0)
$str = substr(self::KEY, 0, 1);
while ($num > 0) {
$val = intval($num / 62);
$mod = $num % 62;
$str = substr(self::KEY, $mod, 1) . $str;
$num = $val;
}
return $str;
}
/**
* 将编码字符串转换为 Int 类整型数值
* @param string $code
* @return int
*/
public static function decodeInt($code){
$result = null;
$len = strlen($code);
for ($i = 1; $i <= $len; $i++) {
$char = substr($code, $i - 1, 1);
$result += intval(strpos(self::KEY, $char)) * pow(62, $len - $i);
}
return $result;
}
/**
* 支持15位长度的整型,超过则精度大幅降低
* @param int $num
* @return string
*/
public static function encodeInt2($num) {
$out = '';
for ($t = floor(log10($num)/log10(62)); $t >= 0; $t--) {
$a = floor($num/bcpow(62, $t));
$out = $out . substr(self::KEY, $a, 1);
$num = $num - $a * pow(62, $t);
}
return $out;
}
/**
* 支持最大15位整型字符串的解码
* @param string $num
* @return string
*/
public static function decodeInt2($num) {
$out = 0;
$len = strlen($num) - 1;
for ($t = 0; $t <= $len; $t++) {
$out = $out + strpos(self::KEY, substr( $num, $t, 1 )) * pow(62, $len - $t);
}
return $out;
}
/**
* 将 BigInt 类型的数值转换为指定进制值
* @param int|string $num
* @return string
*/
public static function encodeBigInt($num) {
bcscale(0);
$str = '';
if ($num <= 0)
$str = substr(self::KEY, 0, 1);
while ($num > 0) {
$div = bcdiv($num, 62);
$mod = bcmod($num, 62);
$str = substr(self::KEY, $mod, 1) . $str;
$num = $div;
}
return $str;
}
/**
* 将编码字符串转换为 BigInt 类整型数值
* @param string $code
* @return string
*/
public static function decodeBigInt($code) {
bcscale(0);
$result = '';
$len = strlen($code);
for ($i = 1; $i <= $len; $i++) {
$char = substr($code, $i - 1, 1);
$result = bcadd(bcmul(strpos(self::KEY, $char), bcpow(62, $len - $i)), $result);
}
return $result;
}
}
测试方法:
结果:
echo 'Begin ~~<br><hr><br>';
$begin = microtime(true);
$bm = memory_get_usage();
$j = 0;
$cv = new Convert();
//for ($i = 0; $i < 10000; $i++) {
$raw = '9223372036854775807';//rand(200000, 214748) . rand(1000, 3648);
$encode = $cv->encodeBigInt($raw);
$decode = $cv->decodeBigInt($encode);
// $encode = $is->encodeInt($raw);
// $decode = number_format($is->decodeInt($encode), 0, '', '');
if ($raw != $decode) {
$j++;
// echo '<script>alert("not same");</script>';
}
//}
echo '原文: '. $raw .' 长度: '. strlen($raw) .'<br>';
echo '编码: '. $encode .' 长度: '. strlen($encode) .'<br>';
echo '解码: '. $decode .'<br>';
echo '不一致:'. $j;
echo '<br>';
$em = memory_get_usage();
echo 'End !<br><hr><br>Use Time :';
echo microtime(true) - $begin;
echo '<br><hr><br>Use Mem:';
echo ceil(($em - $bm)/1024/1024) .'MB';
将int,bigint整型数值可逆转换字符串的更多相关文章
- 【C语言】字符串与整型数值之间的转换
一.将字符串转化为对应的数值 /*============================================================================= # # F ...
- Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型
ylbtech-Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:整型数值类型 1.返回顶部 1. 整型数值类型(C# 参考) 2019/10/22 “整型数值类型”是“简单类型”的 ...
- java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量?
java程序中默认整形值常量是什么类型的?如何区分不同类型的整型数值常量? 整数值默认就是int类型,只有在数值常量后面加“L”或“l”才表明该常量是long型
- Java中二进制数与整型之间的转换
import java.io.*; public class Test{ /** * 二进制与整型之间的转换 * @param args * @throws IOException */ public ...
- python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串
磨人的小妖精们啊!终于可以归置下自己的大脑啦,在这里我要把--整型,长整型,浮点型,字符串,列表,元组,字典,集合,这几个知识点特别多的东西,统一的捯饬捯饬,不然一直脑袋里面乱乱的. 对于Python ...
- Python基础:1.数据类型(空、布尔类型、整型、长整型、浮点型、字符串)
提示:python版本2.7,windows系统 Python提供的基本数据类型:空.布尔类型.整型.长整型.浮点型.字符串.列表.元组.字典.日期 1.空(None) None,是一个特殊的值,不能 ...
- python基础一整型、bool、字符串
1整型.bool.字符串 1.整型 --数字(int) 用于比较运算的 32位 -2 ** 31 ~ 2 ** 31 -1 64位 -2 ** 63 ~ 2 ** 63 -1 基础运算 ...
- Java把长整型时间转成字符串日期
数据库里存放的是timestamp格式,前端取得后是这种:1436255550710长整型时间截转换成"2015-07-07"这种格式呢? import java.io.IOExc ...
- Number 强制类型转换 int 强制转换整型 float 强制转换浮点型 complex 强制转换成复数 bool 强制转换成布尔类型,结果只有两种,要么True 要么 False """bool 可以转换所有的数据类型 everything"""
# ###Number 强制类型转换 var1 = 5 var2 = 4.85 var3 = True var3_2 = False var4 = 3+9j var5 = "888777&q ...
随机推荐
- python进程池剖析(三)
之前文章对python中进程池的原理.数据流以及应用从代码角度做了简单的剖析,现在让我们回头看看标准库中对进程池的实现都有哪些值得我们学习的地方.我们知道,进程池内部由多个线程互相协作,向客户端提供可 ...
- 老调重弹--面向对象设计原则--S.O.L.I.D设计原则
SRP - 单一职责原则 全称:Single Responsibility Principle 定义:每一个上下文对象(类.函数.变量等等)的定义应该仅仅包含单一的职责 描述:对象提供单一职责的高度封 ...
- SpringMVC格式化显示
SpringMVC学习系列(7) 之 格式化显示 在系列(6)中我们介绍了如何验证提交的数据的正确性,当数据验证通过后就会被我们保存起来.保存的数据会用于以后的展示,这才是保存的价值.那么在展示的时候 ...
- bootstrap + angularjs + seajs构建Web Form前端2
bootstrap + angularjs + seajs构建Web Form前端(二) 回顾 上一篇讲解了引入bootstrap构建一个简单的登录页面,如何让angularjs自动启动并绑定视图,操 ...
- LInux 2.6 编译内核出现Question
问:在make menuconfig配置完之后(选的默认配置),然后就make出现如下错误:root@org:/usr/src/linux-2.6.32.27# make CHK include/li ...
- ecshop下启用QQ在线服务,并能实时更新QQ在线状态
按照 http://blog.csdn.net/zurich1979/article/details/9082201 可轻松实现在线客服, 但是使用后发现一个问题,那就是这种情况下在线客服不能根据QQ ...
- Robots惊恐记
昨天发现在百度上搜索不到网站krely.cn的关键词(季小鱼),我记得之前的排名是第四位.到底是哪里的错误导致这个问题呢. 百度排名丢失,那么360会不会也出现同样的错误呢. 可以看到,360提示是我 ...
- Memcached安装配置最大使用内存
Memcached安装配置最大使用内存 项目做了很多,虽然用memcached的项目也有很多.但是没有太关注安装memcached细节问题 最近做了一个项目,把很多东西都放到memcached缓存中, ...
- IOS开发小功能1:引导页的开发
效果图如上,实现的是一个页面引导页,最后跳到主页面,主页面是一个navigationController,但是导航栏给我隐藏了. 文件目录:自己定制的viewcontroller以及navigatio ...
- c语言算法题目求职用
1.栈的压入与压出/* 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.n<=100000 用一个栈作辅助,顺序描述压入序列和弹出序列,如果当前位置上压入序列 ...