java 短链接生成

  1. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    package shorurl;
    import org.apache.commons.codec.digest.DigestUtils;
    import org.apache.commons.lang.StringUtils;
    publicclassShortUrl{
    privatestaticfinalint BINARY =0x2;
    privatestaticfinalint NUMBER_61 =0x0000003d;
    staticfinalchar[] DIGITS ={'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','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'};
    protectedString shorten(String longUrl){
    String shortUrl = shorten(longUrl,5);
    if(StringUtils.isEmpty(shortUrl)){
    shortUrl = shorten(longUrl,6);
    }
    return shortUrl;
    }
    publicString shorten(String longUrl,int urlLength){
    if(urlLength <0|| urlLength >6){
    thrownewIllegalArgumentException("the length of url must be between 0 and 6");
    }
    String md5Hex =DigestUtils.md5Hex(longUrl);
    // 6 digit binary can indicate 62 letter & number from 0-9a-zA-Z
    int binaryLength = urlLength *6;
    long binaryLengthFixer =Long.valueOf(StringUtils.repeat("1", binaryLength), BINARY);
    for(int i =0; i <4; i++){
    String subString =StringUtils.substring(md5Hex, i *8,(i +1)*8);
    subString =Long.toBinaryString(Long.valueOf(subString,16)& binaryLengthFixer);
    subString =StringUtils.leftPad(subString, binaryLength,"0");
    StringBuilder sbBuilder =newStringBuilder();
    for(int j =0; j < urlLength; j++){
    String subString2 =StringUtils.substring(subString, j *6,(j +1)*6);
    int charIndex =Integer.valueOf(subString2, BINARY)& NUMBER_61;
    sbBuilder.append(DIGITS[charIndex]);
    }
    String shortUrl = sbBuilder.toString();
    return shortUrl;
    }
    returnnull;
    }
    }

      

posted on   荣锋亮  阅读(886)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2014-04-03 sql server 数字字符串的排序

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示