Как стать автором
Обновить

Комментарии 21

Да, API Мегафон тоже отличное и легкое решение задачи.
Но моя статья о том, как делать определение очень быстро, локально у себя, без лишних зависимостей. А также, на какие данные и алгоритмы это определение опирается.
При необходимости, кстати, можно самому поднять у себя подобный API (готовая реализация есть репозитории).
Серьезный подход, маски, деревья, java.
Знание домашнего региона — это хорошо, но в чём практическая польза от знания оператора?
НЛО прилетело и опубликовало эту надпись здесь
Пополнение счета, sms шлюзы, и т.д.

Из тех, что сейчас приходят в голову:


  • главным образом это может пригодиться, если вы используете какие-то операторские услуги, которые отличаются по цене от оператора к оператору. Такие как: мобильная коммерция (оплата услуг со счета абонента), или, например, рассылка сообщений;
  • как сказали в комментарии выше, цена звонка абоненту может отличаться;
  • можно для UI анкеты пользователя рядом с полем ввода телефона рисовать иконку оператора и страны (красивости и доп. валидация);
  • возможно будет полезна статистика, пользователей какого оператора у вас больше.
600 Мбайт на 6 миллионов записей это по 100 байт на одну запись.
Если применить нехитрое наблюдение, что все номера представляют собой вид 79xxx-???-???, то можно завести одну таблицу первичного поиска на 1000 записей для поиска по xxx части. Содержать эта таблица будет указатели на таблицы вторичного поиска, в которых содержится ???-??? часть и 1 байт для обозначения оператора.
???-??? можно хранить как BCD.
Получаем расход памяти в первичной таблице 1000*sizeof(pointer) = 8000 байт для 64 битного приложения.
По вторичному поиску получаем 1000*sizeof(пустой vector) + (3 байта для номера+ 1 байт на обозначение оператора)*количество номеров всего = 1000*20+4*6*10^6= 24020000 байт.
Добавка 8кбайт таблицы первичного поиска на результат почти не влияет и получаем 4,003 (чуть больше 4) байт на запись.
Поиск будет двоичным по вторичным таблицам, но за счет заметно меньшего объема памяти будет заметно быстрее, имхо. т.к. узким местом будет обмен с памятью, поскольку в кеш это все не влазит.

Можно разбить как 79xxx-xx?-???, и получить меньше 4 байт на запись, но тогда записи в таблицах вторичного поиска будут по 3 байта и не будут выровнены. Это может негативно сказаться на производительности.
В конце концов мы сделаем поиск по ключу 79031?????? и обнаружим, что номер относится к оператору Билайн, Москва.

Или обнаружим несколько записей, п.ч. диапазоны могут быть разделены некратно 10^n. Там есть диапазоны и по 2, и по 5, и по 242 номера, к сожалению.
И, кстати, регионы диапазонов заданы у Россвязи не кодами, а наименованиями, которые могут обозначать один регион разными способами. Например, «Свердловская обл» и «Свердловская область». Какие-то работы по приведению названий в порядок явно ведутся, судя по обновлениям, но пока не закончены. Также, названия некоторых регионов (навскидку, к сожалению, не вспомню) и операторов не бьются с БДПН.

Для этого, я в библиотеке сделал систему фильтров, которые по регулярным выражениям из конфигов преобразуют названия операторов и регионов.
На данный момент, я навел порядок с названиями крупных операторов. Особо сильное разнообразие операторов у того же Tele2.
С регионами тоже надо будет как-нибудь разобраться и заполнить их конфигурацию.

Уверяю вас, тут будет все будет хорошо.


Действительно, у Россвязи очень много таких диапазонов (особенно почему-то у Tele2).
В таких случаях диапазон будет записан в виде нескольких масок.
Например, диапазон из 2-5 номеров моя библиотека пребразует к 2-5 маскам которые в точности будут повторять эти номера.
А, скажем, диапазон 888-999 будет записан как набор масок [888, 889, 89?, 9??], каждая из которых будет поставлена в соответствие одному объекту-оператору.


Код который это делает можно посмотреть тут.

Интересный вариант. Спасибо

Ранее оператор и регион определялись по первым 5 цифрам федерального номера.
В связи с возможностью сменить оператора теперь так можно достоверно определить только регион
Остальные 5 цифрам в данном контексте нужны только, чтобы точно определить оператора

Сейчас, к сожалению, этот метод уже не сработает.
Например, самые первые в списке маски Россвязи:
90000????? – Tele2 Краснодарский край
90001????? – Tele2 Тверская обл.

Не вижу противоречия
Берём первые 5 цифр из вашего примера и получаем регион
PS под регионом я подразумеваю то, что мобильные операторы называют домашней сетью — по сути область, в которой зарегистрирован абонент, она же является отчётной точкой для тарификации

Первые пять цифр первого номера «90000» — Краснодарский край.
Первые пять цифр второго номера «90001» — Тверская обл.
Это совершенно разные области.
И эти первые цифры больше нигде больше не могут повториться у других операторов в реестре Россвязи.

И если бы ваше правило работало, то у операторов в конкретных областях не было бы емкостей больше 100.000 номеров. А это не так, т.к. есть емкости, например, по 1.000.000 номеров. Например Tele2 Москва: (901)-5??-????
Можно же определять через сервисы, предоставляющие пополнение счёта, например Qiwi. Они недавно тут писали, что еще API теперь для всех ФЛ теперь открытое, не знаю, может через API тоже можно определять оператора?
Не знаю, как у Qiwi, но в первом комментарии была ссылка на статью, где упоминался API Мегафон, который определяет и регион и оператора, вроде даже с учетом MNP.
Да, я видел. Но ведь лучше больше API, чем меньше?
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.