Skip to content

MAC Address Generator — Java source

Generate random EUI-48 MAC addresses with a chosen separator, optional OUI prefix, uppercase formatting, and a locally-administered flag. Runs entirely in your browser with crypto-grade randomness.

This is the Java implementation — the same logic the interactive tool runs, in a shareable, citable form.

// mac-address-generator — random EUI-48 MAC address generator. Java 17 port
// (canonical TS: src/lib/mac-generator.ts; Go twin: cli/mac-address-generator).
// The default rng draws from SecureRandom (the crypto source the TS lib
// uses); the showcase keeps the rng injectable (DoubleSupplier returning
// [0, 1)) so the demo asserts exact MAC strings.
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.function.DoubleSupplier;

public class MacGenerator {
    private static final SecureRandom RANDOM = new SecureRandom();

    /** Options mirror the TS MacOptions interface; fluent setters keep the
     *  call sites as terse as the TS object literal. */
    public static final class MacOptions {
        String separator = ":";               // empty string concatenates
        boolean uppercase = false;
        String oui = "";                      // empty -> random OUI octets
        boolean locallyAdministered = false;  // force U/L bit (0x02) of the first octet
        DoubleSupplier rng = MacGenerator::defaultRng;

        public MacOptions separator(String s) { separator = s; return this; }
        public MacOptions uppercase(boolean b) { uppercase = b; return this; }
        public MacOptions oui(String s) { oui = s; return this; }
        public MacOptions locallyAdministered(boolean b) { locallyAdministered = b; return this; }
        public MacOptions rng(DoubleSupplier r) { rng = r; return this; }
    }

    static double defaultRng() { return RANDOM.nextInt(1 << 30) / (double) (1 << 30); }

    // Strip non-hex chars, require exactly 6 digits, parse the 3 OUI octets.
    static int[] parseOui(String oui) {
        StringBuilder clean = new StringBuilder();
        for (char c : oui.toCharArray()) if (Character.digit(c, 16) >= 0) clean.append(c);
        if (clean.length() != 6)
            throw new IllegalArgumentException("OUI must be 6 hex digits, got \"" + oui + "\"");
        return new int[] { Integer.parseInt(clean.substring(0, 2), 16),
                           Integer.parseInt(clean.substring(2, 4), 16),
                           Integer.parseInt(clean.substring(4, 6), 16) };
    }

    // Build a random EUI-48 MAC: 3 OUI octets (given or random) + 3 random,
    // U/L bit forced when asked, joined as %02x with the separator.
    public static String generate(MacOptions o) {
        List<Integer> oct = new ArrayList<>();
        if (!o.oui.isEmpty()) for (int b : parseOui(o.oui)) oct.add(b);
        else for (int i = 0; i < 3; i++) oct.add((int) (o.rng.getAsDouble() * 256));
        for (int i = 0; i < 3; i++) oct.add((int) (o.rng.getAsDouble() * 256));
        if (o.locallyAdministered) oct.set(0, (oct.get(0) & 0xFD) | 0x02);
        List<String> parts = new ArrayList<>();
        for (int b : oct) parts.add(String.format("%02x", b));
        String mac = String.join(o.separator, parts);
        return o.uppercase ? mac.toUpperCase(Locale.ROOT) : mac;
    }

    public static void main(String[] args) {
        System.out.println(generate(new MacOptions().rng(() -> 0)));                              // 00:00:00:00:00:00
        System.out.println(generate(new MacOptions().separator("-")));                            // 6 random pairs, dash-joined
        System.out.println(generate(new MacOptions().rng(() -> 0.7).uppercase(true)));            // B3:B3:B3:B3:B3:B3
        System.out.println(generate(new MacOptions().rng(() -> 0).oui("aa-bb-cc")));             // aa:bb:cc:00:00:00
        System.out.println(generate(new MacOptions().rng(() -> 0.5).locallyAdministered(true))); // 82:80:80:80:80:80
    }
}

Also available in 13 other languages

Every CosmoDev tool ships its pure logic in TypeScript (web) and Go (CLI), with authored implementations in a dozen-plus languages — the same contract, ported. Compare all languages side by side →