如何在 PHP 中将 Ipv4 转换为 5 个字符的标识符?

How to convert an Ipv4 to a 5 char identifier in PHP?

如何在 PHP 中将 Ipv4 和端口转换为 5 个字符的标识符?

例如,

localhost/127.0.0.1:80

为此:

localhost/#12345 //#12345 is the 127.0.0.1:80

这可以在 PHP 中完成吗?又如何?

我认为只有 5 个字符是不可能的。考虑到您只需要 URL 中的 "safe" 个字符,这些字符是字母数字和一些其他字符,例如下划线。最多有84个这样的字符(我找不到权威的答案)。但是每个 IP 号码都可以从 0 到 255。并且有数千个可能的端口。最多五个字符,您无法表示所有可能的 IP/port 组合。

对于"obfuscate" IP,您可以将其作为字符串并通过编码函数传递,尽管确定的用户将能够对其进行解码。考虑内置函数

$str = '127.0.0.1:8000';

$encoded = urlencode(base64_encode($str));
$decoded = base64_decode(urldecode($encoded));

看过In this answer

或者您可以使用您的编码方案。

5个字符(每个字符8位)是32+8位 ipV4 是 32 位,因此您可以转换 ip,但不能转换端口(给定适合您的基础,您只能使用 255 个端口范围)

我相信您真正想要的不是转换器,而是 URL shortener. If that's the case, I highly recommend watching this video which explains how YouTube 创建它们的唯一 ID。基本上,他们使用一个完全随机的 base64 数字,长度为 11 个字符,由字符 0-9、A-Z、a-z、- 和 _ 组成。根据您使用的字符数,让您了解这允许多少种不同的组合:

  1. 64种组合
  2. (64x64) = 4096 种组合
  3. (64x64x64) = 262144 组合
  4. (64x64x64x64) = 16777216 组合
  5. (64x64x64x64x64) = 1073741824 组合

所以基本思想是生成一个随机数,确保该数字不存在于您的数据库中,然后存储您可以与您的 IP 地址(或任何其他您想要的)相关联的数字。以下代码作为如何创建此类数字的示例提供。

// get random text
// default charset base64: +/A-Za-z0-9
// $len: desired length
// $chars: optional string of characters to use
function randText($len, $chars = null) {
    if ($len < 1) {
        return false;
    }

    if (!isset($chars)) {
        // base64 result is about 33% longer than input
        $num_bytes = ceil($len * 0.75);
        $bytes = randBytes($num_bytes);
        return substr(rtrim(base64_encode($bytes), '='), 0, $len);
    }

    $char_len = strlen($chars);
    if ($char_len == 1) {
        return str_repeat($chars, $len);
    }

    $bytes = randBytes($len);
    $pos = 0;
    $result = '';
    for ($i = 0; $i < $len; $i++) {
        $pos = ($pos + ord($bytes[$i])) % $char_len;
        $result .= $chars[$pos];
    }

    return $result;
}

// to be used in conjunction with randText()
function randBytes($len) {
    $result = '';
    if (extension_loaded('openssl')) {
        $result = openssl_random_pseudo_bytes($len, $strong);
        if ($strong === true) {
            return $result;
        }
    }

    // fallback, more predictable
    for ($i = 0; $i < $len; $i++) {
        $result .= chr(mt_rand(0, 255));
    }

    return $result;
}

有了这两个函数,我们现在可以获取一个唯一的 ID(使用适当的 URL 安全字符)并存储它:

$chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_';
$shortcode = randText(5, $chars);

// pseudo code
if (already_exists($shortcode)) {
    // get a new shortcode
} else {
    update_database($shortcode, '127.0.0.1:80');
}

现在,当有人访问您网站上的 URL 时,您可以获取唯一标识符,在您的数据库中找到 IP,并通过 URL rewriting and/or some type of Front Controller pattern 相应地处理请求。