半天不到,实现仿微博URL短地址算法与解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 半天不到,实现仿微博URL短地址算法与解析


最近,项目中需要用到短网址(ShortUrl)的算法,于是在网上搜索一番,发现有C#的算法,有 .Net 的算法,有 PHP 的算法,就是没有找到Java版的短网址(ShortUrl)的算法,很是郁闷。同时还发现有不少网友在发帖求助,怎么实现Java版的短网址(ShortUrl)的算法。干脆一不做,二不休,参考了一下网上比较流行的PHP版短网址(ShortUrl)算法:

再根据自己的理解,用Java实现了该短网址(ShortUrl)的算法。目前企业内部能凑合着用,“毫无压力”!

先来废话一下,是在别人的帖子上看到的,主要是让大家了解一下短网址(ShortUrl)。

短链转长链

时下,短网址应用已经在全国各大微博上开始流行了起来。例如QQ微博的url.cn,新郎的t.cn等。

制转换

我们在新浪微博上发布网址的时候,微博会自动判别网址,并将其转换,例如:http://t.cn/hrYnr0。为什么要这样做的,原因我想有这样几点:

1、微博限制字数为140字一条,那么如果我们需要发一些连接上去,但是这个连接非常的长,以至于将近要占用我们内容的一半篇幅,这肯定是不能被允许的,所以短网址应运而生了。

2、短网址可以在我们项目里可以很好的对开放级URL进行管理。有一部分网址可以会涵盖性、暴力、广告等信息,这样我们可以通过用户的举报,完全管理这个连接将不出现在我们的应用中,应为同样的URL通过加密算法之后,得到的地址是一样的。

3、我们可以对一系列的网址进行流量,点击等统计,挖掘出大多数用户的关注点,这样有利于我们对项目的后续工作更好的作出决策。

其实以上三点纯属个人观点,因为在我接下来的部分项目中会应用到,所以就了解了一下,下面先来看看短网址映射算法的理论(网上找到的资料):

① 将长网址用md5算法生成32位签名串,分为4段,,每段8个字符;

② 对这4段循环处理,取每段的8个字符, 将他看成16进制字符串与0x3fffffff(30位1)的位与操作,超过30位的忽略处理;

③ 将每段得到的这30位又分成6段,每5位的数字作为字母表的索引取得特定字符,依次进行获得6位字符串;

④ 这样一个md5字符串可以获得4个6位串,取里面的任意一个就可作为这个长url的短url地址。

很简单的理论,我们并不一定说得到的URL是唯一的,但是我们能够取出4组URL,这样几乎不会出现太大的重复。

首先,请大家了解在Java中如何用MD5来加密字符串得到32位的加密后的字符串,下面是我已经封装好的Java MD5算法:

private final static String[] hexDigits = {
  "0", "1", "2", "3", "4", "5", "6", "7", 
  "8", "9", "a", "b", "c", "d", "e", "f"}; 
public static String byteArrayToHexString(byte[] b){
        StringBuffer resultSb = new StringBuffer();
        for (int i = 0; i < b.length; i++){
                resultSb.append(byteToHexString(b[i]));
        }
        return resultSb.toString();
}
private static String byteToHexString(byte b){
        int n = b;
        if (n < 0)
                n = 256 + n;
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
}
public static String MD5Encode(String origin){
        String resultString = null;
                try {
                        resultString=new String(origin);
                        MessageDigest md = MessageDigest.getInstance("MD5");
                        resultString.trim();
                        resultString=byteArrayToHexString(md.digest(resultString.getBytes("UTF-8")));
                }catch (Exception ex){}
                return resultString;
        }
public static void main(String[] args) 
{
        String data = "189022881112011111118:09sz0000123456789987654321";
        System.out.println(MD5Encode(data));
}
public class ShortUrl { 
    public static void main(String[] args) { 
        String url = "http://www.sunchis.com"; 
        for (String string : ShortText(url)) { 
            print(string); 
        } 
    } 
    public static String[] ShortText(String string){ 
        String key = "XuLiang";                 //自定义生成MD5加密字符串前的混合KEY 
        String[] chars = new String[]{          //要使用生成URL的字符 
            "a","b","c","d","e","f","g","h", 
            "i","j","k","l","m","n","o","p", 
            "q","r","s","t","u","v","w","x", 
            "y","z","0","1","2","3","4","5", 
            "6","7","8","9","A","B","C","D", 
            "E","F","G","H","I","J","K","L", 
            "M","N","O","P","Q","R","S","T", 
            "U","V","W","X","Y","Z" 
        }; 
        String hex = MD5Encode(key + string); 
        int hexLen = hex.length(); 
        int subHexLen = hexLen / 8; 
        String[] ShortStr = new String[4]; 
        for (int i = 0; i < subHexLen; i++) { 
            String outChars = ""; 
            int j = i + 1; 
            String subHex = hex.substring(i * 8, j * 8); 
            long idx = Long.valueOf("3FFFFFFF", 16) & Long.valueOf(subHex, 16); 
            for (int k = 0; k < 6; k++) { 
                int index = (int) (Long.valueOf("0000003D", 16) & idx); 
                outChars += chars[index]; 
                idx = idx >> 5; 
            } 
            ShortStr[i] = outChars; 
        } 
        return ShortStr; 
    } 
    private static void print(Object messagr){ 
        System.out.println(messagr); 
    } 
}

下面来看看程序部分:现在可以直接使用ShortText(url)方法,可以等到下面四组值:

ShortText("http://www.xttblog.com")[0];  //得到值:Jzyqma 
ShortText("http://www.xttblog.com")[1];  //得到值:QBrMzm 
ShortText("http://www.xttblog.com")[2];  //得到值:bQreM3 
ShortText("http://www.xttblog.com")[3];  //得到值:VNBRna 

选取结果中四个值的任何一个值即可作为URL对应生成的短网址了。

目前公司内部的链接还不是特别多,访问也不大。花1天时间,搞个破系统,先上线了完成业务需求。后面再参考网上的一些优秀算法来改进!



相关文章
|
21天前
|
存储 算法 安全
.NET 平台 SM2 国密算法 License 证书生成深度解析
授权证书文件的后缀通常取决于其编码格式和具体用途。本文档通过一个示例程序展示了如何在 .NET 平台上使用国密 SM2 算法生成和验证许可证(License)文件。该示例不仅详细演示了 SM2 国密算法的实际应用场景,还提供了关于如何高效处理大规模许可证文件生成任务的技术参考。通过对不同并发策略的性能测试,开发者可以更好地理解如何优化许可证生成流程,以满足高并发和大数据量的需求。 希望这段描述更清晰地传达了程序的功能和技术亮点。
95 13
.NET 平台 SM2 国密算法 License 证书生成深度解析
|
10天前
|
存储 监控 算法
关于员工上网监控系统中 PHP 关联数组算法的学术解析
在当代企业管理中,员工上网监控系统是维护信息安全和提升工作效率的关键工具。PHP 中的关联数组凭借其灵活的键值对存储方式,在记录员工网络活动、管理访问规则及分析上网行为等方面发挥重要作用。通过关联数组,系统能高效记录每位员工的上网历史,设定网站访问权限,并统计不同类型的网站访问频率,帮助企业洞察员工上网模式,发现潜在问题并采取相应管理措施,从而保障信息安全和提高工作效率。
30 7
|
1月前
|
监控 算法 安全
内网桌面监控软件深度解析:基于 Python 实现的 K-Means 算法研究
内网桌面监控软件通过实时监测员工操作,保障企业信息安全并提升效率。本文深入探讨K-Means聚类算法在该软件中的应用,解析其原理与实现。K-Means通过迭代更新簇中心,将数据划分为K个簇类,适用于行为分析、异常检测、资源优化及安全威胁识别等场景。文中提供了Python代码示例,展示如何实现K-Means算法,并模拟内网监控数据进行聚类分析。
43 10
|
1月前
|
存储 监控 算法
探秘员工泄密行为防线:基于Go语言的布隆过滤器算法解析
在信息爆炸时代,员工泄密行为对企业构成重大威胁。本文聚焦布隆过滤器(Bloom Filter)这一高效数据结构,结合Go语言实现算法,帮助企业识别和预防泄密风险。通过构建正常操作“指纹库”,实时监测员工操作,快速筛查可疑行为。示例代码展示了如何利用布隆过滤器检测异常操作,并提出优化建议,如调整参数、结合日志分析系统等,全方位筑牢企业信息安全防线,守护核心竞争力。
|
2月前
|
存储 算法 安全
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
62 17
|
16天前
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
116 0
|
17天前
|
存储 算法 安全
基于 Go 语言的公司内网管理软件哈希表算法深度解析与研究
在数字化办公中,公司内网管理软件通过哈希表算法保障信息安全与高效管理。哈希表基于键值对存储和查找,如用户登录验证、设备信息管理和文件权限控制等场景,Go语言实现的哈希表能快速验证用户信息,提升管理效率,确保网络稳定运行。
27 0
|
1天前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
41 29
|
4月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
145 2
|
10天前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。

热门文章

最新文章

推荐镜像

更多