php - 如何将(大)整数映射到(小尺寸(带有 PHP 的字母数字字符串?(Cantor?)

标签 php string mapping integer alphanumeric

我不知道如何在 PHP 中以最佳方式执行以下操作: 在数据库中,我有具有唯一 ID 的消息,例如 19041985。现在,我想在短 URL 服务中引用这些消息,但不使用生成的哈希值,而是简单地“计算”原始 ID。

换句话说,例如:http://short.url/sYsn7 应该让我计算访问者想要请求的消息 ID。

为了让它更明显,我在 PHP 中编写了以下代码来生成这些“字母数字 ID 版本”,当然,反过来我可以计算原始消息 ID。

问题是:这是执行此操作的最佳方式吗?我几乎不这么认为,但想不出其他任何东西。

$alphanumString = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-_';
for($i=0;$i < strlen($alphanumString);$i++)
{
 $alphanumArray[$i] = substr($alphanumString,$i,1);
}



$id = 19041985;

$out = '';
for($i=0;$i < strlen($id);$i++) {

 if(isset($alphanumString["".substr($id,$i,2).""]) && strlen($alphanumString["".substr($id,$i,2).""]) > 0) {
  $out.=$alphanumString["".substr($id,$i,2).""];
 } else {
  $out.=$alphanumString["".substr($id,$i,1).""];
  $out.=$alphanumString["".substr($id,($i+1),1).""];
 }
 $i++;
}

print $out;

最佳答案

echo trim(base64_encode(pack("L", 19041987)), "=");
print_r(unpack("L", base64_decode("w44iAQ")));
  • Pack 将数字改为四个字节,非常短但不可读。
  • Base64_encode 将四个字节更改为一些更易于人类阅读的字符。
  • 它附加了一些不需要的=字符。

如果你执行 base64_encode(19041987),你会得到字符串“19041987”的编码,它并不短。

关于php - 如何将(大)整数映射到(小尺寸(带有 PHP 的字母数字字符串?(Cantor?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2997041/

相关文章:

php - MAMP 和 DigitalOcean LAMP Ubuntu 14.04 服务器之间的区别弄乱了 Joomla 自定义表单字段

php - 由一个相关表填充多个下拉菜单 CakePHP 3

javascript - 如何删除字符串中仅出现一次的 'abc' ?

string - 在 matplotlib 中绘制字符串列表

java - Hibernate XML 映射 - 一个接一个地创建新字段并将其添加到多列约束中

java - 使用递归构建 JSON 树

PHP关键字函数在合并两个数组后中断

c++ - 没有已定义函数的匹配函数

mapping - 如何在 Dyalog APL 中操作多个嵌套数组?

php - mysql 5.6 - mysql 命令提示符不再工作,服务仍在运行