Compare commits
10 Commits
1.0-SNAPSH
...
1.1-SNAPSH
| Author | SHA1 | Date | |
|---|---|---|---|
| b2e94b3b86 | |||
| 720ccf1952 | |||
| ba1cbc9674 | |||
| 949030d606 | |||
| 350f59bfe2 | |||
| 907bde792a | |||
| 2ff9313a2a | |||
| 7420b84f5f | |||
| 4980f0d1f6 | |||
| c1d105939b |
4
NOTICE
Normal file
4
NOTICE
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
gnu_java_utils_library
|
||||||
|
Copyright 2026 gtb520
|
||||||
|
|
||||||
|
本作品基于[gnu_java_utils_library](https://git.opensource-studio.info/database-mysql/gnu_java_utils_library.git)构建,遵循Apache License 2.0许可协议。
|
||||||
69
README.md
69
README.md
@@ -105,11 +105,76 @@ main.echo.Println("警告信息", ColorNameEnum.YELLOW);
|
|||||||
main.echo.ColorHexPrintln("自定义颜色", "31");
|
main.echo.ColorHexPrintln("自定义颜色", "31");
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### 3. 随机生成器 (`random`)
|
||||||
|
|
||||||
|
随机生成器,提供生成随机字符串、数字、UUID 等功能。
|
||||||
|
|
||||||
|
| 方法 | 说明 | 参数 |
|
||||||
|
|------|------|---------------------------------|
|
||||||
|
| `processing.random.defaults.random(start_scope, end_scope)` | 根据输入的范围生成随机数 | `start_scope` 起始数,`end_scope` 结束数 |
|
||||||
|
| `processing.random.defaults.randomString(int length)` | 生成指定长度的随机字符串 | `length` 字符串长度 |
|
||||||
|
|
||||||
|
**使用示例:**
|
||||||
|
|
||||||
|
```java
|
||||||
|
package top.gtb520.java.gnu.java.utils.library.utils.processing.random;
|
||||||
|
|
||||||
|
defaults.random(1, 100);
|
||||||
|
defaults.randomString(10);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. HWID生成
|
||||||
|
|
||||||
|
HWID生成器,提供生成硬件ID的功能。
|
||||||
|
|
||||||
|
| 方法 | 说明 | 参数 |
|
||||||
|
|---------------------------------------------------------------------------------------|--------|---|
|
||||||
|
| `processing.hwid.getHWID.generateHWID()` | 生成HWID | 无 |
|
||||||
|
|
||||||
|
**使用示例:**
|
||||||
|
|
||||||
|
```java
|
||||||
|
import top.gtb520.java.gnu.java.utils.library.utils.processing.hwid.getHWID;
|
||||||
|
|
||||||
|
String Hwid_Str;
|
||||||
|
Hwid_Str = getHWID.generateHWID();
|
||||||
|
System.out.println("HWID: " + Hwid_Str);
|
||||||
|
System.out.println("HWID length: " + Hwid_Str.length());
|
||||||
|
```
|
||||||
|
|
||||||
## 构建
|
## 构建
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mvn compile
|
mvn compile
|
||||||
```
|
```
|
||||||
|
或
|
||||||
|
```bash
|
||||||
|
mvn package
|
||||||
|
```
|
||||||
|
|
||||||
|
## 使用
|
||||||
|
编译成功后,将 `target/gnu-java-utils-library-1.0.0.jar` 放入项目依赖中。</br>
|
||||||
|
或者在releases中下载最新版jar包,放入项目依赖中。
|
||||||
|
|
||||||
|
#### 使用示例:
|
||||||
|
|
||||||
|
**pom.xml**
|
||||||
|
```xml
|
||||||
|
<dependencies>
|
||||||
|
<!-- 引入本地依赖,lib/gnu_java_utils_library-1.0-SNAPSHOT.jar -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>top.gtb520.java.gnu</groupId>
|
||||||
|
<artifactId>gnu_java_utils_library</artifactId>
|
||||||
|
<version>1.0-SNAPSHOT</version>
|
||||||
|
<scope>system</scope>
|
||||||
|
<!-- ${project.basedir} 为项目目录, /lib/ 为lib目录,xxxx.jar 依赖的Jar包-->
|
||||||
|
<systemPath>${project.basedir}/lib/gnu_java_utils_library-1.0-SNAPSHOT.jar</systemPath>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 异常处理
|
## 异常处理
|
||||||
|
|
||||||
@@ -120,4 +185,6 @@ mvn compile
|
|||||||
|
|
||||||
## 许可证
|
## 许可证
|
||||||
|
|
||||||
本项目仅供学习与个人使用。
|
Apache License 2.0
|
||||||
|
|
||||||
|
禁止商业用途
|
||||||
|
|||||||
2
pom.xml
2
pom.xml
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<groupId>top.gtb520.java.gnu</groupId>
|
<groupId>top.gtb520.java.gnu</groupId>
|
||||||
<artifactId>gnu_java_utils_library</artifactId>
|
<artifactId>gnu_java_utils_library</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>1.1-SNAPSHOT</version>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<maven.compiler.source>25</maven.compiler.source>
|
<maven.compiler.source>25</maven.compiler.source>
|
||||||
|
|||||||
@@ -38,4 +38,24 @@ public interface main {
|
|||||||
top.gtb520.java.gnu.java.utils.library.utils.print.echo.ColorHexPrintln(Message, ColorCode);
|
top.gtb520.java.gnu.java.utils.library.utils.print.echo.ColorHexPrintln(Message, ColorCode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 随机数生成接口与方法
|
||||||
|
interface random {
|
||||||
|
// 默认随机数生成
|
||||||
|
static int defaule(int start_scope, int end_scope) {
|
||||||
|
return top.gtb520.java.gnu.java.utils.library.utils.processing.random.defaults.random(start_scope, end_scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成指定长度的随机字符串
|
||||||
|
static String randomString(int length) {
|
||||||
|
return top.gtb520.java.gnu.java.utils.library.utils.processing.random.defaults.randomString(length);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 硬件信息获取接口与方法,HWID
|
||||||
|
interface hwid {
|
||||||
|
static String getHWID() {
|
||||||
|
return top.gtb520.java.gnu.java.utils.library.utils.processing.hwid.getHWID.generateHWID();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,13 +8,35 @@ public class echo {
|
|||||||
// 终端彩色打印
|
// 终端彩色打印
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 使用自定义十六进制颜色码在终端打印彩色文本
|
* 使用自定义颜色码在终端打印彩色文本
|
||||||
|
* 支持三种格式:
|
||||||
|
* - "#RRGGBB" 十六进制颜色(如 "#FFC0CB")
|
||||||
|
* - ANSI 颜色代码(如 "31" 表示红色)
|
||||||
|
* - ANSI 扩展色(如 "38;5;208" 表示扩展色)
|
||||||
*
|
*
|
||||||
* @param Message 要打印的文本内容
|
* @param Message 要打印的文本内容
|
||||||
* @param HexColor ANSI 颜色代码(如 "31" 表示红色,"38;5;208" 表示扩展色)
|
* @param HexColor 颜色代码,支持 "#RRGGBB"、ANSI 颜色代码或扩展色
|
||||||
*/
|
*/
|
||||||
public static void ColorHexPrintln(String Message, String HexColor) {
|
public static void ColorHexPrintln(String Message, String HexColor) {
|
||||||
System.out.println("\033[" + HexColor + "m" + Message + "\033[0m");
|
if (HexColor.startsWith("#") && (HexColor.length() == 7 || HexColor.length() == 4)) {
|
||||||
|
// #RRGGBB 或 #RGB 格式,转换为 ANSI 真彩色序列
|
||||||
|
String hex = HexColor.substring(1);
|
||||||
|
int r, g, b;
|
||||||
|
if (hex.length() == 3) {
|
||||||
|
// #RGB 简写格式,将每个字符扩展为两位(如 F -> FF)
|
||||||
|
r = Integer.parseInt(String.valueOf(hex.charAt(0)), 16) * 17;
|
||||||
|
g = Integer.parseInt(String.valueOf(hex.charAt(1)), 16) * 17;
|
||||||
|
b = Integer.parseInt(String.valueOf(hex.charAt(2)), 16) * 17;
|
||||||
|
} else {
|
||||||
|
r = Integer.parseInt(hex.substring(0, 2), 16);
|
||||||
|
g = Integer.parseInt(hex.substring(2, 4), 16);
|
||||||
|
b = Integer.parseInt(hex.substring(4, 6), 16);
|
||||||
|
}
|
||||||
|
System.out.println("\033[38;2;" + r + ";" + g + ";" + b + "m" + Message + "\033[0m");
|
||||||
|
} else {
|
||||||
|
// 原有 ANSI 颜色代码直接拼接
|
||||||
|
System.out.println("\033[" + HexColor + "m" + Message + "\033[0m");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,426 @@
|
|||||||
|
package top.gtb520.java.gnu.java.utils.library.utils.processing.hwid;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
import java.net.NetworkInterface;
|
||||||
|
import java.security.MessageDigest;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class getHWID {
|
||||||
|
private final static boolean Debug = false;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成硬件标识符(HWID)
|
||||||
|
* 组合CPU、主板、MAC地址等信息生成唯一标识
|
||||||
|
*/
|
||||||
|
public static String generateHWID() {
|
||||||
|
try {
|
||||||
|
List<String> hardwareInfo = new ArrayList<>();
|
||||||
|
|
||||||
|
// 1. 获取CPU信息
|
||||||
|
String cpuInfo = getCPUInfo();
|
||||||
|
if (cpuInfo != null && !cpuInfo.isEmpty()) {
|
||||||
|
hardwareInfo.add("CPU:" + cpuInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 获取主板序列号
|
||||||
|
String motherboardInfo = getMotherboardInfo();
|
||||||
|
if (motherboardInfo != null && !motherboardInfo.isEmpty()) {
|
||||||
|
hardwareInfo.add("MB:" + motherboardInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 获取MAC地址
|
||||||
|
String macAddress = getMacAddress();
|
||||||
|
if (macAddress != null && !macAddress.isEmpty()) {
|
||||||
|
hardwareInfo.add("MAC:" + macAddress);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. 获取硬盘序列号
|
||||||
|
String diskInfo = getDiskSerialNumber();
|
||||||
|
if (diskInfo != null && !diskInfo.isEmpty()) {
|
||||||
|
hardwareInfo.add("DISK:" + diskInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 5. 获取操作系统信息
|
||||||
|
String osInfo = System.getProperty("os.name") + "_" +
|
||||||
|
System.getProperty("os.version");
|
||||||
|
hardwareInfo.add("OS:" + osInfo);
|
||||||
|
|
||||||
|
// 6. 组合所有硬件信息并生成哈希
|
||||||
|
StringBuilder combined = new StringBuilder();
|
||||||
|
for (String info : hardwareInfo) {
|
||||||
|
if (Debug) {
|
||||||
|
System.out.println("info: " + info);
|
||||||
|
System.out.println("hardwareInfo: " + hardwareInfo);
|
||||||
|
System.out.println("combined: " + combined);
|
||||||
|
}
|
||||||
|
combined.append(info).append("|");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Debug) {
|
||||||
|
System.out.println("HWID combined: " + combined.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用SHA-256生成固定长度的哈希值
|
||||||
|
return generateHash(combined.toString());
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return "UNKNOWN_HWID";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检测是否为Android系统
|
||||||
|
*/
|
||||||
|
private static boolean isAndroid() {
|
||||||
|
try {
|
||||||
|
String osName = System.getProperty("os.name").toLowerCase();
|
||||||
|
String javaVmName = System.getProperty("java.vm.name", "").toLowerCase();
|
||||||
|
String javaSpecVendor = System.getProperty("java.specification.vendor", "").toLowerCase();
|
||||||
|
|
||||||
|
// 通过多个特征判断是否为Android
|
||||||
|
return osName.contains("android") ||
|
||||||
|
javaVmName.contains("android") ||
|
||||||
|
javaSpecVendor.contains("android") ||
|
||||||
|
new java.io.File("/system/bin/app_process").exists();
|
||||||
|
} catch (Exception e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取CPU信息
|
||||||
|
*/
|
||||||
|
private static String getCPUInfo() {
|
||||||
|
try {
|
||||||
|
// Android系统特殊处理
|
||||||
|
if (isAndroid()) {
|
||||||
|
return getAndroidCPUInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
String os = System.getProperty("os.name").toLowerCase();
|
||||||
|
Process process;
|
||||||
|
|
||||||
|
if (os.contains("win")) {
|
||||||
|
// Windows: 获取ProcessorId
|
||||||
|
process = Runtime.getRuntime().exec(
|
||||||
|
new String[]{"wmic", "cpu", "get", "ProcessorId"}
|
||||||
|
);
|
||||||
|
} else if (os.contains("mac")) {
|
||||||
|
// macOS
|
||||||
|
process = Runtime.getRuntime().exec(
|
||||||
|
new String[]{"/usr/sbin/sysctl", "-n", "machdep.cpu.brand_string"}
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// Linux: 获取CPU型号
|
||||||
|
process = Runtime.getRuntime().exec(
|
||||||
|
new String[]{"cat", "/proc/cpuinfo"}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
process.waitFor();
|
||||||
|
BufferedReader reader = new BufferedReader(
|
||||||
|
new InputStreamReader(process.getInputStream())
|
||||||
|
);
|
||||||
|
|
||||||
|
String line;
|
||||||
|
StringBuilder result = new StringBuilder();
|
||||||
|
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
line = line.trim();
|
||||||
|
if (!line.isEmpty()) {
|
||||||
|
if (os.contains("win") && !line.equals("ProcessorId")) {
|
||||||
|
return line;
|
||||||
|
} else if (os.contains("mac")) {
|
||||||
|
return line;
|
||||||
|
} else if (line.startsWith("model name")) {
|
||||||
|
return line.split(":", 2)[1].trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 静默失败,返回null
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Android CPU信息
|
||||||
|
*/
|
||||||
|
private static String getAndroidCPUInfo() {
|
||||||
|
StringBuilder cpuInfo = new StringBuilder();
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 方法1: 读取 /proc/cpuinfo
|
||||||
|
BufferedReader reader = new BufferedReader(new FileReader("/proc/cpuinfo"));
|
||||||
|
String line;
|
||||||
|
List<String> infoList = new ArrayList<>();
|
||||||
|
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
line = line.trim();
|
||||||
|
// 提取关键信息
|
||||||
|
if (line.startsWith("Processor") || line.startsWith("model name")) {
|
||||||
|
String[] parts = line.split(":", 2);
|
||||||
|
if (parts.length > 1) {
|
||||||
|
infoList.add("Processor:" + parts[1].trim());
|
||||||
|
}
|
||||||
|
} else if (line.startsWith("Hardware")) {
|
||||||
|
String[] parts = line.split(":", 2);
|
||||||
|
if (parts.length > 1) {
|
||||||
|
infoList.add("Hardware:" + parts[1].trim());
|
||||||
|
}
|
||||||
|
} else if (line.startsWith("CPU implementer")) {
|
||||||
|
String[] parts = line.split(":", 2);
|
||||||
|
if (parts.length > 1) {
|
||||||
|
infoList.add("Implementer:" + parts[1].trim());
|
||||||
|
}
|
||||||
|
} else if (line.startsWith("CPU architecture")) {
|
||||||
|
String[] parts = line.split(":", 2);
|
||||||
|
if (parts.length > 1) {
|
||||||
|
infoList.add("Architecture:" + parts[1].trim());
|
||||||
|
}
|
||||||
|
} else if (line.startsWith("CPU variant")) {
|
||||||
|
String[] parts = line.split(":", 2);
|
||||||
|
if (parts.length > 1) {
|
||||||
|
infoList.add("Variant:" + parts[1].trim());
|
||||||
|
}
|
||||||
|
} else if (line.startsWith("CPU part")) {
|
||||||
|
String[] parts = line.split(":", 2);
|
||||||
|
if (parts.length > 1) {
|
||||||
|
infoList.add("Part:" + parts[1].trim());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
reader.close();
|
||||||
|
|
||||||
|
if (!infoList.isEmpty()) {
|
||||||
|
return String.join("|", infoList);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 静默失败
|
||||||
|
}
|
||||||
|
|
||||||
|
// 方法2: 如果读取文件失败,使用System.getProperty
|
||||||
|
try {
|
||||||
|
String abi = System.getProperty("os.arch", "unknown");
|
||||||
|
String cores = Runtime.getRuntime().availableProcessors() + "";
|
||||||
|
return "ABI:" + abi + "|Cores:" + cores;
|
||||||
|
} catch (Exception e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取主板信息
|
||||||
|
*/
|
||||||
|
private static String getMotherboardInfo() {
|
||||||
|
try {
|
||||||
|
// Android系统特殊处理
|
||||||
|
if (isAndroid()) {
|
||||||
|
return getAndroidMotherboardInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
String os = System.getProperty("os.name").toLowerCase();
|
||||||
|
|
||||||
|
if (os.contains("win")) {
|
||||||
|
Process process = Runtime.getRuntime().exec(
|
||||||
|
new String[]{"wmic", "baseboard", "get", "SerialNumber"}
|
||||||
|
);
|
||||||
|
process.waitFor();
|
||||||
|
BufferedReader reader = new BufferedReader(
|
||||||
|
new InputStreamReader(process.getInputStream())
|
||||||
|
);
|
||||||
|
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
line = line.trim();
|
||||||
|
if (!line.isEmpty() && !line.equals("SerialNumber")) {
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 静默失败
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Android主板信息
|
||||||
|
*/
|
||||||
|
private static String getAndroidMotherboardInfo() {
|
||||||
|
try {
|
||||||
|
List<String> infoList = new ArrayList<>();
|
||||||
|
|
||||||
|
// 读取Android设备特性
|
||||||
|
String brand = System.getProperty("ro.product.brand", "");
|
||||||
|
String manufacturer = System.getProperty("ro.product.manufacturer", "");
|
||||||
|
String model = System.getProperty("ro.product.model", "");
|
||||||
|
String device = System.getProperty("ro.product.device", "");
|
||||||
|
String board = System.getProperty("ro.product.board", "");
|
||||||
|
|
||||||
|
if (!brand.isEmpty()) infoList.add("Brand:" + brand);
|
||||||
|
if (!manufacturer.isEmpty()) infoList.add("Manufacturer:" + manufacturer);
|
||||||
|
if (!model.isEmpty()) infoList.add("Model:" + model);
|
||||||
|
if (!device.isEmpty()) infoList.add("Device:" + device);
|
||||||
|
if (!board.isEmpty()) infoList.add("Board:" + board);
|
||||||
|
|
||||||
|
if (!infoList.isEmpty()) {
|
||||||
|
return String.join("|", infoList);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 静默失败
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取MAC地址
|
||||||
|
*/
|
||||||
|
private static String getMacAddress() {
|
||||||
|
try {
|
||||||
|
Enumeration<NetworkInterface> networkInterfaces =
|
||||||
|
NetworkInterface.getNetworkInterfaces();
|
||||||
|
|
||||||
|
while (networkInterfaces.hasMoreElements()) {
|
||||||
|
NetworkInterface network = networkInterfaces.nextElement();
|
||||||
|
byte[] mac = network.getHardwareAddress();
|
||||||
|
|
||||||
|
if (mac != null && mac.length > 0) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; i < mac.length; i++) {
|
||||||
|
sb.append(String.format("%02X%s", mac[i],
|
||||||
|
(i < mac.length - 1) ? "-" : ""));
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 静默失败
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取硬盘序列号
|
||||||
|
*/
|
||||||
|
private static String getDiskSerialNumber() {
|
||||||
|
try {
|
||||||
|
// Android系统特殊处理
|
||||||
|
if (isAndroid()) {
|
||||||
|
return getAndroidStorageInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
String os = System.getProperty("os.name").toLowerCase();
|
||||||
|
|
||||||
|
if (os.contains("win")) {
|
||||||
|
Process process = Runtime.getRuntime().exec(
|
||||||
|
new String[]{"wmic", "diskdrive", "get", "SerialNumber"}
|
||||||
|
);
|
||||||
|
process.waitFor();
|
||||||
|
BufferedReader reader = new BufferedReader(
|
||||||
|
new InputStreamReader(process.getInputStream())
|
||||||
|
);
|
||||||
|
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
line = line.trim();
|
||||||
|
if (!line.isEmpty() && !line.equals("SerialNumber")) {
|
||||||
|
return line;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (os.contains("mac") || os.contains("linux")) {
|
||||||
|
Process process = Runtime.getRuntime().exec(
|
||||||
|
new String[]{"sh", "-c", "system_profiler SPSerialATADataType | grep 'Serial Number'"}
|
||||||
|
);
|
||||||
|
process.waitFor();
|
||||||
|
BufferedReader reader = new BufferedReader(
|
||||||
|
new InputStreamReader(process.getInputStream())
|
||||||
|
);
|
||||||
|
|
||||||
|
String line;
|
||||||
|
if ((line = reader.readLine()) != null) {
|
||||||
|
if (line.contains(":")) {
|
||||||
|
return line.split(":", 2)[1].trim();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 静默失败
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取Android存储信息
|
||||||
|
*/
|
||||||
|
private static String getAndroidStorageInfo() {
|
||||||
|
try {
|
||||||
|
// 读取 /proc/mounts 或使用系统属性
|
||||||
|
List<String> infoList = new ArrayList<>();
|
||||||
|
|
||||||
|
// 尝试获取存储相关信息
|
||||||
|
String internalStorage = System.getProperty("user.dir", "");
|
||||||
|
if (!internalStorage.isEmpty()) {
|
||||||
|
infoList.add("InternalDir:" + internalStorage);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查外部存储是否可用
|
||||||
|
java.io.File externalStorage = new java.io.File("/sdcard");
|
||||||
|
if (externalStorage.exists()) {
|
||||||
|
infoList.add("ExternalStorage:available");
|
||||||
|
} else {
|
||||||
|
infoList.add("ExternalStorage:not_available");
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取数据目录
|
||||||
|
java.io.File dataDir = new java.io.File("/data");
|
||||||
|
if (dataDir.exists()) {
|
||||||
|
infoList.add("DataDir:exists");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!infoList.isEmpty()) {
|
||||||
|
return String.join("|", infoList);
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// 静默失败
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 使用SHA-256生成哈希值
|
||||||
|
*/
|
||||||
|
private static String generateHash(String input) {
|
||||||
|
try {
|
||||||
|
MessageDigest digest = MessageDigest.getInstance("SHA-256");
|
||||||
|
byte[] hash = digest.digest(input.getBytes("UTF-8"));
|
||||||
|
StringBuilder hexString = new StringBuilder();
|
||||||
|
|
||||||
|
for (byte b : hash) {
|
||||||
|
String hex = Integer.toHexString(0xff & b);
|
||||||
|
if (hex.length() == 1) {
|
||||||
|
hexString.append('0');
|
||||||
|
}
|
||||||
|
hexString.append(hex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return hexString.toString();
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return input.hashCode() + "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
package top.gtb520.java.gnu.java.utils.library.utils.processing.random;
|
||||||
|
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
|
public class defaults {
|
||||||
|
/**
|
||||||
|
* 根据输入的范围生成随机数
|
||||||
|
* @param start_scope 起始范围
|
||||||
|
* @param end_scope 结束范围
|
||||||
|
* @return 随机数
|
||||||
|
*/
|
||||||
|
public static int random(int start_scope, int end_scope) {
|
||||||
|
int random_double;
|
||||||
|
|
||||||
|
// 处理边界,确保起始范围小于等于结束范围
|
||||||
|
if (start_scope > end_scope) {
|
||||||
|
System.out.println("起始范围不能大于结束范围");
|
||||||
|
throw new IllegalArgumentException("起始范围不能大于结束范围");
|
||||||
|
}
|
||||||
|
// 生成随机数
|
||||||
|
random_double = ThreadLocalRandom.current().nextInt(start_scope, end_scope + 1);
|
||||||
|
|
||||||
|
return random_double;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成指定长度的随机字符串
|
||||||
|
* @param length 字符串长度
|
||||||
|
* @return 随机字符串
|
||||||
|
*/
|
||||||
|
public static String randomString(int length) {
|
||||||
|
String alphabetsInUpperCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||||
|
String alphabetsInLowerCase = "abcdefghijklmnopqrstuvwxyz";
|
||||||
|
String numbers = "0123456789";
|
||||||
|
// create a super set of all characters
|
||||||
|
String allCharacters = alphabetsInLowerCase + alphabetsInUpperCase + numbers;
|
||||||
|
// initialize a string to hold result
|
||||||
|
StringBuffer randomString = new StringBuffer();
|
||||||
|
// loop for 10 times
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
// generate a random number between 0 and length of all characters
|
||||||
|
int randomIndex = (int)(Math.random() * allCharacters.length());
|
||||||
|
// retrieve character at index and add it to result
|
||||||
|
randomString.append(allCharacters.charAt(randomIndex));
|
||||||
|
}
|
||||||
|
return randomString.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
16
src/test/java/HwidTest.java
Normal file
16
src/test/java/HwidTest.java
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import top.gtb520.java.gnu.java.utils.library.main;
|
||||||
|
import top.gtb520.java.gnu.java.utils.library.utils.processing.hwid.getHWID;
|
||||||
|
|
||||||
|
public class HwidTest {
|
||||||
|
public static void main() {
|
||||||
|
String Hwid_Str;
|
||||||
|
Hwid_Str = main.hwid.getHWID();
|
||||||
|
System.out.println("HWID: " + Hwid_Str);
|
||||||
|
System.out.println("HWID length: " + Hwid_Str.length());
|
||||||
|
|
||||||
|
String Hwid_Str2;
|
||||||
|
Hwid_Str2 = getHWID.generateHWID();
|
||||||
|
System.out.println("HWID: " + Hwid_Str2);
|
||||||
|
System.out.println("HWID length: " + Hwid_Str2.length());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,5 +9,13 @@ public class echo {
|
|||||||
main.echo.Println("PURPLE", ColorNameEnum.PURPLE);
|
main.echo.Println("PURPLE", ColorNameEnum.PURPLE);
|
||||||
main.echo.Println("GREEN", ColorNameEnum.GREEN);
|
main.echo.Println("GREEN", ColorNameEnum.GREEN);
|
||||||
main.echo.Println("RED", ColorNameEnum.RED);
|
main.echo.Println("RED", ColorNameEnum.RED);
|
||||||
|
|
||||||
|
ColorHexPrintlnTest();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ColorHexPrintlnTest() {
|
||||||
|
main.echo.ColorHexPrintln("ColorHexPrintlnTest_RED", "31");
|
||||||
|
main.echo.ColorHexPrintln("自定义橙色", "38;5;208");
|
||||||
|
main.echo.ColorHexPrintln("十六进制粉色", "#FFC0CB");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
32
src/test/java/echoTest.java
Normal file
32
src/test/java/echoTest.java
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
import top.gtb520.java.gnu.java.utils.library.main;
|
||||||
|
import top.gtb520.java.gnu.java.utils.library.utils.print.ColorNameEnum;
|
||||||
|
|
||||||
|
public class echoTest {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("========== echo 测试开始 ==========");
|
||||||
|
|
||||||
|
// 测试 #RRGGBB 格式
|
||||||
|
main.echo.ColorHexPrintln("十六进制粉色 #FFC0CB", "#FFC0CB");
|
||||||
|
main.echo.ColorHexPrintln("十六进制红色 #FF0000", "#FF0000");
|
||||||
|
main.echo.ColorHexPrintln("十六进制绿色 #00FF00", "#00FF00");
|
||||||
|
main.echo.ColorHexPrintln("十六进制蓝色 #0000FF", "#0000FF");
|
||||||
|
|
||||||
|
// 测试 #RGB 简写格式
|
||||||
|
main.echo.ColorHexPrintln("RGB简写粉色 #F0F", "#F0F");
|
||||||
|
main.echo.ColorHexPrintln("RGB简写白色 #FFF", "#FFF");
|
||||||
|
|
||||||
|
// 测试原有 ANSI 颜色代码(兼容性)
|
||||||
|
main.echo.ColorHexPrintln("ANSI红色 31", "31");
|
||||||
|
main.echo.ColorHexPrintln("ANSI扩展色 38;5;208", "38;5;208");
|
||||||
|
|
||||||
|
// 测试预定义颜色枚举
|
||||||
|
main.echo.Println("枚举红色", ColorNameEnum.RED);
|
||||||
|
main.echo.Println("枚举蓝色", ColorNameEnum.BLUE);
|
||||||
|
main.echo.Println("枚举绿色", ColorNameEnum.GREEN);
|
||||||
|
main.echo.Println("枚举黄色", ColorNameEnum.YELLOW);
|
||||||
|
main.echo.Println("枚举青色", ColorNameEnum.CYAN);
|
||||||
|
main.echo.Println("枚举紫色", ColorNameEnum.PURPLE);
|
||||||
|
|
||||||
|
System.out.println("========== echo 测试完成 ==========");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
package top.gtb520.java.gnu.java.utils.library.utils.processing.random;
|
||||||
|
|
||||||
|
import top.gtb520.java.gnu.java.utils.library.main;
|
||||||
|
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
|
// 毫无意义的随机数测试代码,在循环中执行随机数生成 10 亿次
|
||||||
|
public class Test {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
int totalTasks = 1_000_000_000;
|
||||||
|
// 根据CPU核心数创建固定大小的线程池,避免创建过多线程导致上下文切换开销
|
||||||
|
int threadCount = Runtime.getRuntime().availableProcessors();
|
||||||
|
ExecutorService executor = Executors.newFixedThreadPool(threadCount);
|
||||||
|
|
||||||
|
// 将总任务量平均分配给每个线程
|
||||||
|
int tasksPerThread = totalTasks / threadCount;
|
||||||
|
|
||||||
|
for (int t = 0; t < threadCount; t++) {
|
||||||
|
final int start = t * tasksPerThread;
|
||||||
|
// 处理余数,确保最后一个线程承担剩余任务
|
||||||
|
final int end = (t == threadCount - 1) ? totalTasks : start + tasksPerThread;
|
||||||
|
|
||||||
|
executor.submit(() -> {
|
||||||
|
// 【核心优化1】使用 ThreadLocalRandom 替代共享 Random
|
||||||
|
// 每个线程拥有独立的 seed,完全无锁,避免高并发下的 CAS 竞争
|
||||||
|
ThreadLocalRandom random = ThreadLocalRandom.current();
|
||||||
|
|
||||||
|
// 【核心优化2】将 I/O 与计算分离
|
||||||
|
// 在实际业务中,应只返回计算结果,而不是在循环中打印
|
||||||
|
for (int i = start; i < end; i++) {
|
||||||
|
int random_i = random.nextInt(1, 1000000001); // [1, 1000000000]
|
||||||
|
|
||||||
|
// 如果确实需要输出,建议降低频率(例如每1000万次输出一次)
|
||||||
|
// if (i % 10000 == 0) {
|
||||||
|
// System.out.println("随机数: " + random_i + " 当前循环位置: " + i);
|
||||||
|
// }
|
||||||
|
System.out.println("随机数: " + random_i + " 当前循环位置: " + i);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 优雅关闭线程池
|
||||||
|
executor.shutdown();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,142 @@
|
|||||||
|
package top.gtb520.java.gnu.java.utils.library.utils.processing.random;
|
||||||
|
|
||||||
|
public class defauleTest {
|
||||||
|
|
||||||
|
static int passed = 0;
|
||||||
|
static int failed = 0;
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("========== defaults.random 测试开始 ==========");
|
||||||
|
|
||||||
|
testRandomInRange();
|
||||||
|
testRandomSameStartAndEnd();
|
||||||
|
testRandomNegativeRange();
|
||||||
|
testRandomReversedRange();
|
||||||
|
testRandomLargeRange();
|
||||||
|
testRandomDistribution();
|
||||||
|
|
||||||
|
System.out.println("========================================");
|
||||||
|
System.out.println("测试完成: 通过 " + passed + ", 失败 " + failed);
|
||||||
|
if (failed > 0) {
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试正常范围内的随机数
|
||||||
|
*/
|
||||||
|
static void testRandomInRange() {
|
||||||
|
String testName = "testRandomInRange";
|
||||||
|
try {
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
int result = defaults.random(1, 10);
|
||||||
|
if (result < 1 || result > 10) {
|
||||||
|
assertCondition(testName + " - 随机数应在[1,10]范围内,实际: " + result, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertCondition(testName + " - 100次随机数均在[1,10]范围内", true);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertCondition(testName + " - 不应抛出异常: " + e.getMessage(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试起始值等于结束值
|
||||||
|
*/
|
||||||
|
static void testRandomSameStartAndEnd() {
|
||||||
|
String testName = "testRandomSameStartAndEnd";
|
||||||
|
try {
|
||||||
|
int result = defaults.random(5, 5);
|
||||||
|
assertCondition(testName + " - 结果应等于5,实际: " + result, result == 5);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertCondition(testName + " - 不应抛出异常: " + e.getMessage(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试负数范围
|
||||||
|
*/
|
||||||
|
static void testRandomNegativeRange() {
|
||||||
|
String testName = "testRandomNegativeRange";
|
||||||
|
try {
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
int result = defaults.random(-10, -1);
|
||||||
|
if (result < -10 || result > -1) {
|
||||||
|
assertCondition(testName + " - 随机数应在[-10,-1]范围内,实际: " + result, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertCondition(testName + " - 100次随机数均在[-10,-1]范围内", true);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertCondition(testName + " - 不应抛出异常: " + e.getMessage(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试起始值大于结束值应抛出异常
|
||||||
|
*/
|
||||||
|
static void testRandomReversedRange() {
|
||||||
|
String testName = "testRandomReversedRange";
|
||||||
|
try {
|
||||||
|
defaults.random(10, 1);
|
||||||
|
assertCondition(testName + " - 应抛出IllegalArgumentException", false);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
assertCondition(testName + " - 应抛出IllegalArgumentException", true);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertCondition(testName + " - 异常类型不正确: " + e.getClass().getName(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试大范围随机数
|
||||||
|
*/
|
||||||
|
static void testRandomLargeRange() {
|
||||||
|
String testName = "testRandomLargeRange";
|
||||||
|
try {
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
int result = defaults.random(-1000000, 1000000);
|
||||||
|
if (result < -1000000 || result > 1000000) {
|
||||||
|
assertCondition(testName + " - 随机数超出范围,实际: " + result, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertCondition(testName + " - 100次随机数均在[-1000000,1000000]范围内", true);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertCondition(testName + " - 不应抛出异常: " + e.getMessage(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 测试随机数分布(验证不会总是返回同一个值)
|
||||||
|
*/
|
||||||
|
static void testRandomDistribution() {
|
||||||
|
String testName = "testRandomDistribution";
|
||||||
|
try {
|
||||||
|
int first = defaults.random(1, 1000000);
|
||||||
|
boolean hasDifferent = false;
|
||||||
|
for (int i = 0; i < 100; i++) {
|
||||||
|
int result = defaults.random(1, 1000000);
|
||||||
|
if (result != first) {
|
||||||
|
hasDifferent = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertCondition(testName + " - 100次调用应产生不同随机数", hasDifferent);
|
||||||
|
} catch (Exception e) {
|
||||||
|
assertCondition(testName + " - 不应抛出异常: " + e.getMessage(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ========== 辅助方法 ==========
|
||||||
|
|
||||||
|
static void assertCondition(String message, boolean condition) {
|
||||||
|
if (condition) {
|
||||||
|
System.out.println("[PASS] " + message);
|
||||||
|
passed++;
|
||||||
|
} else {
|
||||||
|
System.out.println("[FAIL] " + message);
|
||||||
|
failed++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package top.gtb520.java.gnu.java.utils.library.utils.processing.random;
|
||||||
|
|
||||||
|
public class randomStringTest {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
defaults.random(1, 100);
|
||||||
|
defaults.randomString(10);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user