powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Function ip2num :: codereview
6 сообщений из 6, страница 1 из 1
Function ip2num :: codereview
    #39727475
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет коллеги.

Прошу сделать code-review фунеции и сказать что в ней не красиво и что
можно улучшить. Особо интересуют performance-issues и работа со строками.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
-- in - IP address in decimal format with dots. Ex: '127.0.0.1'
-- out - biginteger, that represents IP address.
create function ip2num(ip varchar) returns bigint as $$
declare 
  w text; 
  x text;
  y text;
  z text; 
  l   integer;
  cp  integer;
  cp2 integer; 
begin

  l := char_length(ip);
  if l > 15 then 
    return null;
  end if;  
  if l < 7 then 
    return null;
  end if;
  
  -- 192.168.1.1

  cp  := 1; 
  cp2 := position('.' in ip); -- 4
  l   := cp2 - cp; -- 3
  w   := substring(ip from cp for l); -- '192'

  cp  := cp2 + 1; -- 5
  cp2 := cp  + position('.' in substring(ip from cp)) - 1; -- 8
  l   := cp2 - cp; -- 8-5=3
  x   := substring(ip from cp for l); -- 168
  
  cp  := cp2 + 1; 
  cp2 := cp  + position('.' in substring(ip from cp)) - 1; 
  l   := cp2 - cp; 
  y   := substring(ip from cp for l); 

  z   := substring(ip from cp2 + 1);

  return 16777216 * cast(w as bigint) + 
            65536 * cast(x as bigint) + 
              256 * cast(y as bigint) + 
                    cast(z as bigint);
end;
$$ language plpgsql immutable;





Некоторое время назад я был озабочен IP-адресами и географией 17380387 и написал на Oracle несколько
PL/SQL функций для преобразования IP в целое число и обратно.

Понадобилось сделать этот-же функционал для PG-PLSQL.
...
Рейтинг: 0 / 0
Function ip2num :: codereview
    #39727481
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Код: sql
1.
SELECT ('127.0.0.1'::inet - '0.0.0.0'::inet) as ip_integer;
...
Рейтинг: 0 / 0
Function ip2num :: codereview
    #39727483
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм... красиво. Но в моем варианте виден интерфейс функции.

Как быть с вашим решением если я захочу построить функциональный индекс по IP адресу?
...
Рейтинг: 0 / 0
Function ip2num :: codereview
    #39727485
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Код: sql
1.
2.
3.
4.
5.
6.
7.
create table i (id int, addr inet);
insert into i select g, 
((random()*254+1)::int||'.'||(random()*254+1)::int||'.'||(random()*254+1)::int||'.'||(random()*254+1)::int)::inet
 from generate_series(1,1000000) g;
create index i_addr on i((addr-'0.0.0.0'::inet));
analyze i;
explain select * from i where addr-'0.0.0.0'::inet < 10;
...
Рейтинг: 0 / 0
Function ip2num :: codereview
    #39727578
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОсобо интересуют performance-issues и работа со строками.
Ты в курсе, что числа в IP адресе, начинающиеся с нуля, считаются восьмеричными?
...
Рейтинг: 0 / 0
Function ip2num :: codereview
    #39727641
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovmaytonОсобо интересуют performance-issues и работа со строками.
Ты в курсе, что числа в IP адресе, начинающиеся с нуля, считаются восьмеричными?
Да. Но это не полноценный парсер адресов. Я брал только формат MaxMind овской базы. Если копать так глубоко как вы предлагаете то я должен поддержать и hex и нотацию без разделителей.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Function ip2num :: codereview
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]