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 →