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

如何在PHP中将Ipv4转换为5字符标识符?,php,ipv4,Php,Ipv4,如何在PHP中将Ipv4和端口转换为5个字符的标识符 比如说, localhost/127.0.0.1:80 为此: localhost/#12345 //#12345 is the 127.0.0.1:80 这可以在PHP中实现吗?怎么做呢?我认为只有5个字符是不可能的。考虑只在URL中需要“安全”字符,URL是字母数字的,还有一些像下划线那样的。最多有84个这样的字符(我找不到权威的答案)。但是每个IP号码可以从0到255。还有数千个可能的港口。最多有五个字符,不能表示所有可能的IP/端

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

比如说,

localhost/127.0.0.1:80
为此:

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

这可以在PHP中实现吗?怎么做呢?

我认为只有5个字符是不可能的。考虑只在URL中需要“安全”字符,URL是字母数字的,还有一些像下划线那样的。最多有84个这样的字符(我找不到权威的答案)。但是每个IP号码可以从0到255。还有数千个可能的港口。最多有五个字符,不能表示所有可能的IP/端口组合

要“混淆”IP,您可以将其作为字符串并通过编码函数传递,尽管确定的用户将能够对其进行解码。考虑建筑材料

$str = '127.0.0.1:8000';

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

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

5个字符(每个字符8位)是32+8位 ipV4是32位的,因此您可以转换ip,但不能转换端口(如果有适合您的基础,您只能转换255个端口)

我相信你真正想要的不是一个转换器,而是一个。如果是这样的话,我强烈建议观看这部电影,它解释了如何创建他们的唯一ID。基本上,它们使用的是一个完全随机的base64数字,长度为11个字符,由字符0-9、a-Z、a-Z-和_组成。根据您使用的字符数,让您了解这允许多少种不同的组合:

  • 64种组合
  • (64x64)=4096个组合
  • (64x64x64)=262144个组合
  • (64x64x64x64)=16777216个组合
  • (64x64x64x64)=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;
    }
    

    现在,当有人访问您网站上的URL时,您可以获取唯一标识符,在数据库中查找IP,并通过和/或某种类型的URL来相应地处理请求。

    没有明显的现成方式,所以,你最好再多加一点描述,说明你正在努力实现的目标,这样我们就可以建议一种方法it@RiggsFolly我不希望整个ip显示在地址栏上,我也想隐藏它。在我看来,你想要一个可显示的ip地址?这是一种糟糕的形式,而且会泄露访问者的个人信息。即使是困惑不解的你也为聪明人提供了一个解决问题的方法。在一天结束时,这是二进制数据(每八位字节4 8位)+16位端口范围。没有办法用5个字符来实现这一点,除非你真正的意思是你想要像@mister martin建议的那样的东西。除非字符是ascii码,否则你不能显示它们。虽然你说的端口可能超出一个字节的范围是正确的,但是用5个字符是无法做到这一点的。这正是我想要的!非常感谢。
    $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');
    }