Комментарии 21
Но моя статья о том, как делать определение очень быстро, локально у себя, без лишних зависимостей. А также, на какие данные и алгоритмы это определение опирается.
При необходимости, кстати, можно самому поднять у себя подобный API (готовая реализация есть репозитории).
Из тех, что сейчас приходят в голову:
- главным образом это может пригодиться, если вы используете какие-то операторские услуги, которые отличаются по цене от оператора к оператору. Такие как: мобильная коммерция (оплата услуг со счета абонента), или, например, рассылка сообщений;
- как сказали в комментарии выше, цена звонка абоненту может отличаться;
- можно для UI анкеты пользователя рядом с полем ввода телефона рисовать иконку оператора и страны (красивости и доп. валидация);
- возможно будет полезна статистика, пользователей какого оператора у вас больше.
Если применить нехитрое наблюдение, что все номера представляют собой вид 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 цифрам в данном контексте нужны только, чтобы точно определить оператора
Не вижу противоречия
Берём первые 5 цифр из вашего примера и получаем регион
PS под регионом я подразумеваю то, что мобильные операторы называют домашней сетью — по сути область, в которой зарегистрирован абонент, она же является отчётной точкой для тарификации
Первые пять цифр второго номера «90001» — Тверская обл.
Это совершенно разные области.
И эти первые цифры больше нигде больше не могут повториться у других операторов в реестре Россвязи.
И если бы ваше правило работало, то у операторов в конкретных областях не было бы емкостей больше 100.000 номеров. А это не так, т.к. есть емкости, например, по 1.000.000 номеров. Например Tele2 Москва: (901)-5??-????
Как определить мобильного оператора и домашний регион по номеру телефона