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日

相关文章

  • Jvisualvm监控远程SpringBoot项目的过程详解

    以下是“JVisualVM监控远程SpringBoot项目的过程详解”的完整攻略: 简介 JVisualVM是Java虚拟机监视器和性能分析工具的图形化界面,它提供了一组用于分析Java应用程序运行的工具,包括CPU和堆剖析,线程和类查看器,GC鉴定工具等等,可以方便地监控Java应用的性能,分析应用的性能瓶颈。 Spring Boot为开发者提供了一种更简…

    Java 2023年5月20日
    00
  • 教你使用idea搭建ssm详细教程(Spring+Spring Mvc+Mybatis)

    以下是使用Idea搭建SSM框架的详细教程,包括Spring、Spring MVC和MyBatis三个框架的整合。 环境准备 在开始之前,需要确保以下环境已经准备好: JDK 1.8或以上版本 Maven 3.0或以上版本 Tomcat 8.0或以上版本 IntelliJ IDEA 2018或以上版本 创建Maven项目 打开IntelliJ IDEA,选择…

    Java 2023年5月18日
    00
  • 使用JSP读取客户端信息

    使用JSP读取客户端信息需要用到内置对象request,通过request对象的方法获取到客户端的相关信息。 以下是具体的步骤: 在JSP页面中,使用内置对象request获取客户端信息前,需要获取参数request对象。获取的方式是: <% request = request.getRequest(); %> 获取客户端IP地址 <% S…

    Java 2023年6月15日
    00
  • 浅谈JSP与Servlet传值及对比(总结)

    浅谈JSP与Servlet传值及对比(总结)是一篇比较详细介绍 JSP 和 Servlet 之间数据传递的文章。在该文章中,作者讲述了JSP和Servlet传值的几种方式以及它们在不同情况下的使用情况。 1. JSP与Servlet JSP和Servlet是相互联系的,JSP可以添加Java代码,Servlet可以生成HTML代码。JSP和Servlet重点…

    Java 2023年6月15日
    00
  • Java中对List集合的常用操作详解

    Java中对List集合的常用操作详解 List是Java语言中常用的集合类型之一,它可以存储一组有序的元素,且可以通过索引访问这些元素。在Java中,List是一个接口,常用的实现类包括ArrayList、LinkedList等,本文将详细介绍Java中对List集合的常用操作。 1. 创建List对象 在Java中创建List对象需要使用List接口的实…

    Java 2023年5月26日
    00
  • java基础的详细了解第八天

    Java基础的详细了解第八天攻略 一、多线程 1. 线程的创建(继承Thread类) Java中创建线程有两种方式,一种是继承Thread类,另一种是实现Runnable接口。第一种方式的具体代码如下: class MyThread extends Thread { @Override public void run() { // 线程要执行的代码 } } …

    Java 2023年5月30日
    00
  • 浅谈Tomcat乱码与端口占用的解决方案

    浅谈Tomcat乱码与端口占用的解决方案 Tomcat乱码问题 在Tomcat中,中文字符有可能导致乱码问题。解决方案如下: 修改Tomcat的server.xml文件,在Connector中添加URIEncoding属性。 <Connector port="8080" protocol="HTTP/1.1" c…

    Java 2023年5月19日
    00
  • Java ArrayList中存放引用数据类型的方式

    Java的ArrayList是一种动态数组类型,它可以存储引用数据类型,即存储对象的引用。下面是Java ArrayList存放引用数据类型的方式的完整攻略。 1. 创建一个ArrayList 使用Java中的ArrayList类来创建一个ArrayList,代码如下: ArrayList<Object> arrayList = new Arra…

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