Как я могу преобразовать Ipv4 и порт в 5-значный идентификатор в PHP?
Например,
localhost/127.0.0.1:80
К этому:
localhost/#12345 //#12345 is the 127.0.0.1:80
Это возможно сделать в PHP? И как?
Я верю, что вы на самом деле ищете не конвертер, а Сокращение URL. Если это так, я настоятельно рекомендую смотреть это видео что объясняет как YouTube создает свои уникальные идентификаторы. В основном они используют совершенно случайное число base64 длиной 11 символов, состоящее из символов 0-9, A-Z, a-z, — и _. Чтобы дать вам представление о том, сколько различных комбинаций это позволяет, исходя из количества используемых символов:
Таким образом, основная идея заключается в генерации случайного числа, убедитесь, что номер не существует в вашей базе данных, а затем сохраните номер, который вы можете связать с вашим 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 и / или какой-то тип Шаблон переднего контроллера.
Я не думаю, что это возможно только с 5 символов. Учтите, что вам нужны «безопасные» символы только в 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 портов, учитывая базу, подходящую для вас)