如何将(大)整数映射到(小)(使用PHP的字母数字字符串)(Cantor?)

如何将(大)整数映射到(小)(使用PHP的字母数字字符串)(Cantor?),php,string,mapping,integer,alphanumeric,Php,String,Mapping,Integer,Alphanumeric,我不知道如何在PHP中以最佳方式执行以下操作: 在数据库中,我有一个唯一ID的消息,如19041985。现在,我想在一个短url服务中引用这些消息,但不使用生成的哈希,只需“计算”原始ID 换句话说,例如:应该让我计算访问者想要请求的消息ID 为了让它更明显,我用PHP编写了以下代码来生成这些“字母数字ID版本”,当然,另一种方法可以让我计算原始消息ID 问题是:这是做这件事的最佳方式吗?我几乎不这么认为,但想不出其他办法 $alphanumString = '0123456789abcdefg

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

换句话说,例如:应该让我计算访问者想要请求的消息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;
$alphanumString='0123456789abcdefghijklmnopqrstuvxyzabcdefghijklmnopqrstuvxyz-';
对于($i=0;$i0){
$out.=$alphanumString[“”.substr($id,$i,2)。”;
}否则{
$out.=$alphanumString[“”.substr($id,$i,1)。”;
$out.=$alphanumString[“”.substr($id,($i+1),1)。“”;
}
$i++;
}
打印美元;
  • Pack将数字改为四个字节,虽然很短,但无法读取
  • Base64_encode将四个字节更改为一些更易于阅读的字符
  • 它附加了一些不需要的=字符

如果您使用base64_encode(19041987),您将获得字符串“19041987”的编码,该字符串不短。

您不应该在for语句中使用函数,因为它在每个循环中都会播放

比如你的

for($i=0;$i < strlen($alphanumString);$i++)
{
 $alphanumArray[$i] = substr($alphanumString,$i,1);
}
for($i=0;$i
应该是

var $alphaLength = strlen($alphanumString);
for($i=0;$i < $alphaLength;$i++)
{
 $alphanumArray[$i] = substr($alphanumString,$i,1);
}
var$alphaLength=strlen($alphanumString);
对于($i=0;$i<$alphaLength;$i++)
{
$alphanummarray[$i]=substr($alphanumString,$i,1);
}

您正在进行微优化。字符串已经可以作为数组访问。构建这个$alphanumArray是不必要的。实际上,在小型数组中,使用此方法可以获得显著的收益。但我同意这是微优化。这适用于给定的示例,但当ID更大时(比如9876543210)这已经不起作用了:它以字符串形式给出'6hawTA',但在我使用你的示例时返回1286608618。-这起作用的最大数字是多少?我使用BIGINT(20)来存储这些ID,所以在使用base64时,这太大了,对吗?
var $alphaLength = strlen($alphanumString);
for($i=0;$i < $alphaLength;$i++)
{
 $alphanumArray[$i] = substr($alphanumString,$i,1);
}