首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 短網址服務兩大核心算法實現:MD5 碼映射與自增序列 Base62 編碼

     編輯:Java 相關知識

短網址服務核心在於「長 URL → 短 Code」的雙向映射。本文對比兩大主流算法:MD5 截取(定長 5-6 位、極低碰撞、適合美觀需求)與自增序列 Base62(變長、零碰撞、無限容量、適合高吞吐),提供生產級 Java 實現與工程化建議。

算法 1:MD5 碼映射(定長)

  1. 計算長 URL MD5(32 位十六進制)。
  2. 分 4 段,每段 8 字符 → 16 進制數。
  3. 與 N*6 個 1 組成的二進制掩碼 & 運算,得 N*6 位二進制。
  4. 每 6 位取一段,與 61 (0x3D) & 運算得索引(0-61),查字符表 0-9a-zA-Z 拼接。
  5. 4 段各產生一個候選,查庫去重,均存在則返回 null(極低概率)。
static final char[] DIGITS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
public String shorten(String longUrl, int len) {
    String md5 = DigestUtils.md5Hex(longUrl);
    long mask = Long.parseLong("1".repeat(len * 6), 2);
    for (int i = 0; i < 4; i++) {
        String sub = md5.substring(i * 8, (i + 1) * 8);
        String bin = Long.toBinaryString(Long.parseLong(sub, 16) & mask);
        bin = StringUtils.leftPad(bin, len * 6, '0');
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < len; j++) {
            int idx = Integer.parseInt(bin.substring(j * 6, (j + 1) * 6), 2) & 61;
            sb.append(DIGITS[idx]);
        }
        if (!exists(sb.toString())) return sb.toString();
    }
    return null;
}

算法 2:自增序列 Base62(變長)

  1. 原子自增 AtomicLong 獲取唯一序列號。
  2. 62 進制轉換:反複取模 62,查字符表拼接,反轉得短碼。
  3. 長度隨 ID 增長自然增長(1 → 2 → 3 …),無碰撞,容量無上限。
private AtomicLong seq = new AtomicLong(0);
private String toBase62(long n) {
    StringBuilder sb = new StringBuilder();
    do { sb.append(DIGITS[(int)(n % 62)]); n /= 62; } while (n > 0);
    return sb.reverse().toString();
}
public String shorten(String longUrl) { return toBase62(seq.incrementAndGet()); }

工程化關鍵點

維度MD5 算法自增序列
存儲結構雙向 Map / DB 唯一索引DB 自增主鍵 + 短碼唯一索引
分布式擴展需分布式鎖去重分段號段 / Snowflake ID
短碼長度固定 5-6 位1 位起,隨業務增長
可讀性亂碼風格遞增可預測

選型建議:營銷活動、社交分享優先 MD5 固定短碼;內部系統、高併發寫入優先自增 Base62。兩者均可共存,按業務標記區分。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved