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

Java 高效遍歷 MAC 地址區間:從十六進制遞增到批量入庫

     編輯:Java 相關知識

業務場景:為什麼要遍歷 MAC 區間?

物聯網設備管理、網絡設備批量入庫時,常需按 MAC 地址段生成設備檔案。MAC 地址本質是 48 位十六進制數,按數值遞增即可枚舉區間內所有地址,避免逐行解析文本的低效與繁瑣。

核心算法:MAC ⇄ Long 雙向轉換

/**
 * MAC 字符串轉長整型(去冒號,按 16 進制解析)
 */
public static long macToLong(String mac) {
    String hex = mac.replaceAll(":", "");
    return Long.parseLong(hex, 16);
}

/**
 * 長整型轉標準 MAC 字符串(補齊 12 位,插入冒號)
 */
public static String longToMac(long value) {
    String hex = Long.toHexString(value);
    // 高位可能省略導零,需補齊 12 字符
    hex = String.format("%012s", hex).replace(' ', '0');
    StringBuilder sb = new StringBuilder(hex);
    sb.insert(2, ":").insert(5, ":").insert(8, ":").insert(11, ":").insert(14, ":");
    return sb.toString().toUpperCase();
}

區間遍歷與計數實現

/**
 * 打印 [startMac, endMac] 區間內所有 MAC
 */
public static void printMacRange(String startMac, String endMac) {
    long start = macToLong(startMac);
    long end   = macToLong(endMac);
    if (start > end) throw new IllegalArgumentException("起始 MAC 不得大於結束 MAC");

    for (long i = start; i <= end; i++) {
        System.out.println(longToMac(i));
    }
}

/**
 * 計算區間內 MAC 總數(含邊界)
 */
public static long countMacRange(String startMac, String endMac) {
    return macToLong(endMac) - macToLong(startMac) + 1;
}

進階優化:批量入庫與分頁處理

百萬級區間直接循環會阻塞主線程,建議:

  1. 分批提交:每 1000~5000 條批量 INSERT,配合事務控制。
  2. 異步生產:生產者線程生成 MAC,消費者線程批量入庫,BlockingQueue 解耦。
  3. 斷點續傳:記錄已處理的最大 MAC 值,重啟後續傳。
// 生產者示例
public void produceMacBatch(String startMac, String endMac, BlockingQueue<List<String>> queue, int batchSize) {
    long start = macToLong(startMac);
    long end   = macToLong(endMac);
    List<String> batch = new ArrayList<>(batchSize);
    for (long i = start; i <= end; i++) {
        batch.add(longToMac(i));
        if (batch.size() == batchSize) {
            queue.offer(new ArrayList<>(batch));
            batch.clear();
        }
    }
    if (!batch.isEmpty()) queue.offer(batch);
}

常見坑點提示

  • 前綴假設:示例代碼假設前 3 字節(OUI)相同,跨 OUI 區間需拆分多段處理。
  • 大小端:網絡序為大端,Java Long.parseLong 默認大端,轉換無需額外處理。
  • 溢出邊界:MAC 最大值 FF:FF:FF:FF:FF:FF 對應 281474976710655,遠小於 Long.MAX_VALUE,安全。

總結

將 MAC 視為 48 位無符號整數,利用 Long 承載、十六進制格式化輸出,配合批量異步入庫模式,可高效解決千萬級設備批量註冊問題。核心代碼不足 30 行,卻能替換繁瑣的文本解析流程,體現「數據結構決定算法效率」的編程哲學。

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