Как преобразовать Ipv4 в 5-символьный идентификатор в PHP?

Как я могу преобразовать Ipv4 и порт в 5-значный идентификатор в PHP?

Например,

localhost/127.0.0.1:80

К этому:

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

Это возможно сделать в PHP? И как?

2

Решение

Я верю, что вы на самом деле ищете не конвертер, а Сокращение URL. Если это так, я настоятельно рекомендую смотреть это видео что объясняет как YouTube создает свои уникальные идентификаторы. В основном они используют совершенно случайное число base64 длиной 11 символов, состоящее из символов 0-9, A-Z, a-z, — и _. Чтобы дать вам представление о том, сколько различных комбинаций это позволяет, исходя из количества используемых символов:

  1. 64 комбинации
  2. (64×64) = 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;
}

С помощью этих двух функций мы можем теперь получить уникальный идентификатор (с соответствующими 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 и / или какой-то тип Шаблон переднего контроллера.

1

Другие решения

Я не думаю, что это возможно только с 5 символов. Учтите, что вам нужны «безопасные» символы только в URL-адресе, которые состоят из буквенно-цифровых символов и некоторых других, например подчеркивания. Максимум 84 таких персонажа (я не могу найти авторитетный ответ). Но каждый номер IP может идти от 0 до 255. И есть тысячи возможных портов. Максимум пять символов не позволяют представить все возможные комбинации IP / порт.

Чтобы «запутать» IP-адрес, вы можете взять его как строку и пропустить через функцию кодирования, хотя определенный пользователь сможет декодировать его. Рассмотрим встроенные

$str = '127.0.0.1:8000';

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

Видели В этом ответе

Или вы можете использовать вашу схему кодирования.

0

5 символов (8 бит на символ) — это 32 + 8 бит
ipV4 32-битные, так что вы можете конвертировать ip, но не порт (вы застряли с диапазоном 255 портов, учитывая базу, подходящую для вас)

0
По вопросам рекламы [email protected]