java实现短地址服务的方法(附代码)

下面就是关于Java实现短地址服务的方法的详细攻略:

一、引言

随着互联网的飞速发展,短地址服务已经成为了互联网应用中不可或缺的一个环节。短地址服务可以将一个较长的URL地址转化为很短的一串字符,可以极大地缩短URL的长度,增强用户分享的便利性。那么,如何使用Java来实现短地址服务呢?

二、短地址服务的实现方式

短地址可以通过两种方式实现,一种是将长地址使用哈希函数进行加密,生成短地址;另一种是根据编号制作,编号可为10进制、36进制、62进制等。

本文介绍的是第二种方法——根据编号制作。

场景:将长地址转化为短地址的时候,统一使用62进制的编号制作短地址。

具体实现思路:

  1. 执行长地址的md5加密操作,将其转换成一个32位的16进制字符串;

  2. 将16进制字符串分成4个8位的部分,将每个8位字符串转化成int类型的数值;

  3. 将每个数值对62取模,根据对应的62进制表,转换成62进制的字符;

  4. 将转换后的字符连接起来,生成最终的短地址。

接下来,我们将以两个例子为例,对上述思路进行详细的代码实现。

三、代码示例

1. 代码示例一

public class ShortenUrl {
    private static final String BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    private static final int[] INDEXES = new int[128];
    private static final String SEED = "gsdgaiqrotmwevl,x.knupfchzbyj";

    static {
        for (int i = 0; i < BASE62.length(); i++) {
            INDEXES[BASE62.charAt(i)] = i;
        }
    }

    public static String toBase62(long num) {
        StringBuilder sb = new StringBuilder();
        do {
            sb.insert(0, BASE62.charAt((int) (num % 62)));
            num /= 62;
        } while (num > 0);
        return sb.toString();
    }

    public static long toBase10(String str) {
        long result = 0;
        for (int i = 0; i < str.length(); i++) {
            result = result * 62 + INDEXES[str.charAt(i)];
        }
        return result;
    }

    public static String encode(String longUrl) {
        byte[] md5 = DigestUtils.md5(longUrl.getBytes());
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            long tmp = 0xffffffffL & ((long) (md5[3 + i * 4] & 0xff) << 24 | (long) (md5[2 + i * 4] & 0xff) << 16 | (long) (md5[1 + i * 4] & 0xff) << 8 | (long) (md5[0 + i * 4] & 0xff));
            builder.append(toBase62(tmp));
        }
        return builder.toString();
    }

    public static String decode(String shortUrl) {
        long[] tmp = new long[4];
        for (int i = 0; i < 4; i++) {
            tmp[i] = toBase10(shortUrl.substring(i * 5, i * 5 + 5));
        }
        return new String(tmp[0] + tmp[1] + tmp[2] + tmp[3]);
    }

    public static void main(String[] args) {
        String longUrl = "https://www.baidu.com/s?wd=Java%20%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E7%9F%AD%E5%9C%B0%E5%9D%80%E6%9C%8D%E5%8A%A1&rsv_spt=1&rsv_iqid=0xce88c28a00002ed5&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=0&rsv_sug3=16&rsv_sug1=3&rsv_sug7=100&rsv_sug2=0&prefixsug=Java&rsp=4&inputT=895&rsv_sug4=2612";
        String shortUrl = encode(longUrl);
        System.out.println("长地址:" + longUrl);
        System.out.println("短地址:" + shortUrl);
        System.out.println("还原的长地址:" + decode(shortUrl));
    }
}

2. 代码示例二

public class ShortenUrl {
    private static final String BASE62 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    private static final int[] INDEXES = new int[128];
    private static final String SEED = "gsdgaiqrotmwevl,x.knupfchzbyj";

    static {
        for (int i = 0; i < BASE62.length(); i++) {
            INDEXES[BASE62.charAt(i)] = i;
        }
    }

    public static String toBase62(long num) {
        StringBuilder sb = new StringBuilder();
        do {
            sb.insert(0, BASE62.charAt((int) (num % 62)));
            num /= 62;
        } while (num > 0);
        return sb.toString();
    }

    public static long toBase10(String str) {
        long result = 0;
        for (int i = 0; i < str.length(); i++) {
            result = result * 62 + INDEXES[str.charAt(i)];
        }
        return result;
    }

    public static String encode(String longUrl) {
        byte[] md5 = DigestUtils.md5(longUrl.getBytes());
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            long tmp = 0xffffffffL & ((long) (md5[3 + i * 4] & 0xff) << 24 | (long) (md5[2 + i * 4] & 0xff) << 16 | (long) (md5[1 + i * 4] & 0xff) << 8 | (long) (md5[0 + i * 4] & 0xff));
            builder.append(toBase62(tmp));
        }
        return builder.toString();
    }

    public static String decode(String shortUrl) {
        long[] tmp = new long[4];
        for (int i = 0; i < 4; i++) {
            tmp[i] = toBase10(shortUrl.substring(i * 5, i * 5 + 5));
        }
        return new String(tmp[0] + tmp[1] + tmp[2] + tmp[3]);
    }

    public static void main(String[] args) {
        String longUrl = "https://www.baidu.com";
        String shortUrl = encode(longUrl);
        System.out.println("长地址:" + longUrl);
        System.out.println("短地址:" + shortUrl);
        System.out.println("还原的长地址:" + decode(shortUrl));
    }
}

四、总结

通过以上两个示例的演示,我们可以看出,Java实现短地址服务的方法实际上是根据编号制作,使用62进制的编号来生成短地址。而具体的实现过程,主要分为四步,即将长地址的md5值转化为16进制字符串、将16进制字符串分为四个8位的部分、将每个8位字符串转化成int类型的数值、将每个数值对62取模,根据对应的62进制表,转换成62进制的字符、将转换后的字符连接起来,生成最终的短地址。

在实际的开发中,我们也可以根据具体的需求,进行相应的定制化开发,例如自定义编号制、自定义加密方式等。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现短地址服务的方法(附代码) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java 文件传输助手的实现(单机版)

    请允许我详细讲解“Java 文件传输助手的实现(单机版)”的完整攻略。 1. 确定需求和功能 在开始编写 Java 文件传输助手之前,我们首先要确定它需要实现的功能。在单机版的实现中,我们应该至少包含以下的功能: 用户选择要传输的文件。 用户选择接收方的 IP 地址和端口号。 用户可以选择传输的文件类型,例如文本文件或二进制文件等。 用户可以选择传输文件的方…

    Java 2023年5月20日
    00
  • eclipse配置tomcat开发Dynamic Web Project环境图解

    下面我将详细讲解 “eclipse配置tomcat开发Dynamic Web Project环境图解”的完整攻略: 一、前置条件 在进行eclipse配置tomcat开发Dynamic Web Project环境前,需要确保你已经完成以下几个步骤: 安装eclipse,推荐使用最新版本; 安装tomcat,并且成功启动tomcat服务; 安装Java SDK…

    Java 2023年6月2日
    00
  • 使用JAVA通过ARP欺骗类似P2P终结者实现数据封包监听

    首先需要明确的是,ARP欺骗是指通过伪造ARP响应的方式,诱导受害者将数据包发送至攻击者的电脑,从而实现数据封包监听、拦截等攻击行为。下面给出使用Java实现ARP欺骗的攻略过程。 1. 获取受害者电脑的MAC地址 要实现ARP欺骗的攻击,首先需要获取受害者电脑的MAC地址。可以通过以下代码实现: InetAddress address = InetAddr…

    Java 2023年6月15日
    00
  • Kafka多节点分布式集群搭建实现过程详解

    接下来我将详细讲解 “Kafka多节点分布式集群搭建实现过程详解” 的完整攻略。 1. 什么是Kafka Kafka 是一种高吞吐量的分布式发布订阅消息系统,应用于大规模的消息处理环境中,具有高可用、高性能的特点。 2. Kafka 集群搭建 2.1 环境准备 在搭建Kafka集群之前,需要准备好以下环境: Oracle JDK 1.8或以上版本 Zooke…

    Java 2023年5月20日
    00
  • Java基于对象流实现银行系统

    Java基于对象流实现银行系统攻略 1. 理解对象流 对象流是一种可以直接将Java对象写入或读取出来的数据流 对象流可以用于Java对象的序列化和反序列化 2. 设计银行系统类 设计客户类和账户类,客户类包含姓名,身份证号码等基本信息,账户类包含账户号码,账户余额等信息 账户类继承自客户类,可以使用客户类的信息 设计用户登录系统,可以根据账户号码和密码登录…

    Java 2023年5月24日
    00
  • 什么是标记-复制算法?

    以下是关于标记-复制算法的详细讲解: 什么是标记-复制算法? 标记-复制算法是一种常见的垃圾回收算法。它的原理是将内存空间分为两个区域,一部分为活动区,一部分为闲置区。在程序运行程中,标记所有不再使用的内存空间,然后将所有活动区的对象复制到闲置区,最后清空动区,从而回收内存空间。标记-复制算法分两个阶段:标记阶段和复制阶段。 标记阶段 在标记阶段,垃圾回收器…

    Java 2023年5月12日
    00
  • SSH框架网上商城项目第2战之基本增删查改、Service和Action的抽取

    本文将详细讲解SSH框架网上商城项目第2战之基本增删查改、Service和Action的抽取的完整攻略,包括概述、步骤、示例等内容。 概述 SSH框架是指以Struts2作为Web层,Spring作为业务层和数据访问层的容器,Hibernate作为数据持久化层的开发框架。本次攻略的目的是介绍如何在SSH框架下实现基本增删查改操作,以及Service和Acti…

    Java 2023年6月15日
    00
  • 记一次Maven项目改造成SpringBoot项目的过程实践

    针对您的问题,我将按照以下步骤进行详细讲解: 1. 创建Spring Boot项目 首先,我们需要创建一个Spring Boot项目。可以在Spring Initializr上选择相应的配置选项,添加所需的依赖,然后点击“Generate”按钮生成项目。 2. 导入原有项目 在创建好的Spring Boot项目中,我们需要将原有的Maven项目代码导入。一般…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部