php - 将字符串转换为基础转换 62
问题描述
我正在尝试制作 URL 缩短器。Give url 需要转换为 base 62 的位置
我已将 URL 转换为以下内容,但它会将其转换为随机数,例如0
or1sromm8
或 2gs0ygibs
base_convert($shortener->full_url, 10, 36);
我如何将其转换为 base62,以便每次生成 5 个字符的唯一名称。
解决方案
我使用这个自定义函数将 String 转换为 base62 String
function b62e($str) {
if(mb_check_encoding($str, 'ASCII')) {
$out = '';
$len = strlen($str);
for($i=0; $i<$len; $i+=8) {
$chunk = substr($str, $i, 8);
$outlen = ceil( strlen($chunk)*8/6 );// 8bit/char in, 6bits/char out, round up
$hex = bin2hex($chunk);// gmp won't convert from binary, so go via hex
$raw = gmp_strval(gmp_init(ltrim($hex, '0'), 16), 62);// gmp doesn't like leading 0s
$out .= str_pad($raw, $outlen, '0', STR_PAD_LEFT);
}
return $out;
}
return false;// unicode chars not supported
}
function b62d($str) {
if(mb_check_encoding($str, 'ASCII')) {
$out = '';
$len = strlen($str);
for ($i=0; $i<$len; $i+=11) {
$chunk = substr($str, $i, 11);
$outlen = floor( strlen($chunk)*6/8 );// 6bit/char in, 8bits/char out, round down
$raw = gmp_strval(gmp_init(ltrim($chunk, '0'), 62), 16);// gmp doesn't like leading 0s
$pad = str_pad($raw, $outlen * 2, '0', STR_PAD_LEFT);// double output length as as we're going via hex (4bits/char)
$out .= pack('H*', $pad);// same as hex2bin
}
return $out;
}
return false;// unicode chars not supported
}
演示
所有学分归Marcus Bointon 提供,感谢Flash Thunder的回答
愿你也使用混淆器来防止用户解码变量
function obf62rep($which){// make array before translate string
$rep = [];
$str1 = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$str2 = 'GHIJKLMNqrstuvwx01OPQRSTUVWXYZhijklmnop23456789abcdefgyzABCDEF';
if($which){// while obfuscate from-->to
$fr = str_split($str1);
$to = $str2;
}else{// while de-obfuscate to-->from
$fr = str_split($str2);
$to = $str1;
}
foreach($fr as $k=>$v){// make array tr-->to
$rep[$v] = $to[$k];
}
return $rep;
}
function obf62e($str){return strtr($str,obf62rep(1));}// translate string = obf
function obf62d($str){return strtr($str,obf62rep(0));}// translate back = deobf
然后让它更易于使用,比如
function ob62e($str){return obf62e(b62e($str));}// encode base62 + obfuscate
function ob62d($str){return b62d(obf62d($str));}// decode base62 + deobfuscate
示例使用
echo ob62e('test');
$name = ob62e('jhon');
推荐阅读
- assembly - 可以在运行时更改汇编代码吗?
- angular - 如何从 localhost url 访问我的“access_token”?
- c# - 如何从 Main() 启动应用程序的多个实例?
- python - 尝试通过二分搜索找到非完美立方体的立方根时的无限循环
- python - 如何混合包含字符串值的多个数据框
- python - 了解熊猫系列提取函数中的正则表达式
- docker - 无法将 docker 映像推送到 GCP 注册表:被拒绝:项目的令牌交换失败
拒绝访问 - python - 如何使用 pandas & beautiful soup 在多个网页地址上抓取表格?
- docker - docker:挂载/var/run/docker.sock后找不到
- java - 从 Firebase 数据库中检索图像并在我的应用程序的屏幕上显示它们