V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
EeeMt
V2EX  ›  程序员

手机号归属地离线查询- Java

  •  
  •   EeeMt · 2020-02-11 14:15:50 +08:00 · 2759 次点击
    这是一个创建于 1777 天前的主题,其中的信息可能已经有所发展或是发生改变。

    Github: https://github.com/EeeMt/phone-number-geo

    根据手机号离线查询手机号运营商及归属地, 支持包括虚拟运营商的中国大陆手机号查询. 适合对号码覆盖范围有要求的, 内网 /离线使用.

    觉得可以点个Star啊.

    已发布到maven中央仓库.

    <dependency>
        <groupId>me.ihxq.projects</groupId>
        <artifactId>phone-number-geo</artifactId>
        <version>x.x.x-xxxxxx</version>
    </dependency>
    

    这里获取最新版号.

    下面都是摘抄REAMDME.md的内容

    example

    class Demo1{
        public static void main(String[] args){
            PhoneNumberLookup phoneNumberLookup = new PhoneNumberLookup();
            PhoneNumberInfo found = phoneNumberLookup.lookup("18798896741").orElseThrow(RuntimeException::new);
        }
    }
    
    class Demo2{
        public static void main(String[] args){
            PhoneNumberLookup phoneNumberLookup = new PhoneNumberLookup();
            String province = phoneNumberLookup.lookup("130898976761")
                            .map(PhoneNumberInfo::getAttribution)
                            .map(Attribution::getProvince)
                            .orElse("未知");
        }
    }
    
    class Demo3{
        public static void main(String[] args){
            PhoneNumberLookup phoneNumberLookup = new PhoneNumberLookup();
            PhoneNumberInfo found = phoneNumberLookup.lookup("18798896741").orElseThrow(RuntimeException::new);
            found.getNumber(); // 18798896741
            found.getAttribution().getProvince(); // 贵州
            found.getAttribution().getCity(); // 贵阳
            found.getAttribution().getZipCode(); // 550000
            found.getAttribution().getAreaCode(); // 0851
            found.getIsp(); // ISP.CHINA_MOBILE
        }
    }
    

    对比libphonenumber

    libphonenumber有更多功能, 包括验证号码格式, 格式化, 时区等, 但基于xluohome/phonedata提供的dat数据库能囊括包含虚拟运营商号段的更多号段.

    至于速度, 未做比较, 选择时建议更多权衡易用性, 功能和数据覆盖范围.

    Benchmark

    工程里已内置四种算法, 跑分情况如下:

    Benchmark                                   Mode  Cnt        Score       Error  Units
    BenchmarkRunner.anotherBinarySearchLookup   avgt    5      390.483 ±     3.544  ns/op
    BenchmarkRunner.binarySearchLookup          avgt    5      386.357 ±     3.739  ns/op
    BenchmarkRunner.prospectBinarySearchLookup  avgt    5      304.622 ±     1.899  ns/op
    BenchmarkRunner.sequenceLookup              avgt    5  1555265.227 ± 48814.379  ns/op
    

    性能测试源码位于me.ihxq.projects.pna.benchmark.BenchmarkRunner, 基于JMH

    测试样本在每次启动时生成, 供所有算子测试使用, 所以每次测试结果有差异, 结果可用于横向比较, 不适用于纵向比较.

    默认使用的是me.ihxq.projects.pna.algorithm.BinarySearchAlgorithmImpl, 可以通过new PhoneNumberLookup(new AlgorithmYouLike());使用其他算法;

    也可自行实现算法, 实现me.ihxq.projects.pna.algorithm.LookupAlgorithm即可.

    6 条回复    2020-02-12 15:40:41 +08:00
    monospace
        1
    monospace  
       2020-02-11 17:17:57 +08:00
    携号转网的情况能 cover 吗?
    jugelizi
        2
    jugelizi  
       2020-02-11 17:32:05 +08:00
    类似于 ip 离线库?
    fancy20
        3
    fancy20  
       2020-02-11 18:18:09 +08:00
    想说我也写过这个,然后看到写了参考了我的 java 实现
    EeeMt
        4
    EeeMt  
    OP
       2020-02-12 15:31:54 +08:00
    @fancy20 😂
    EeeMt
        5
    EeeMt  
    OP
       2020-02-12 15:32:39 +08:00
    @jugelizi 是的
    EeeMt
        6
    EeeMt  
    OP
       2020-02-12 15:40:41 +08:00
    @monospace 暂时没有验证这个, 不过既然是离线的, 数据更新滞后也不可避免, 所以如果不太适合有高准确性要求的场景.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1171 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:17 · PVG 02:17 · LAX 10:17 · JFK 13:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.