如何在 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、- 和 _ 组成。根据您使用的字符数,让您了解这允许多少种不同的组合:
- 64种组合
- (64x64) = 4096 种组合
- (64x64x64) = 262144 组合
- (64x64x64x64) = 16777216 组合
- (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 相应地处理请求。
如何在 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、- 和 _ 组成。根据您使用的字符数,让您了解这允许多少种不同的组合:
- 64种组合
- (64x64) = 4096 种组合
- (64x64x64) = 262144 组合
- (64x64x64x64) = 16777216 组合
- (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 相应地处理请求。