需求:java写一个使用md5加密当前时间,生成一个id值,然后创建表t_key_加上id值。
步骤:
1、获取当前时间戳。
2、使用MD5加密时间戳生成ID。
3、拼接表名t_key_id。
4、使用JDBC执行CREATE TABLE语句。
实现:
import java.security.MessageDigest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.time.Instant;
public class KeyTableGenerator {
// 数据库配置(需根据实际情况修改)
private static final String DB_URL = "jdbc:mysql://localhost:3306/test_db";
private static final String DB_USER = "root";
private static final String DB_PASSWORD = "123456";
public static void main(String[] args) {
try {
// 1. 生成基于当前时间的MD5 ID
String timeBasedId = generateTimeBasedMD5Id();
// 2. 动态创建表
createDynamicTable(timeBasedId);
System.out.println("表 t_key_" + timeBasedId + " 创建成功");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 生成基于当前时间的MD5 ID
*/
private static String generateTimeBasedMD5Id() {
try {
// 获取当前时间戳(精确到毫秒)
String timestamp = String.valueOf(Instant.now().toEpochMilli());
// MD5加密
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hashBytes = md.digest(timestamp.getBytes());
// 转换为十六进制字符串
StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
hexString.append(String.format("%02x", b));
}
return hexString.toString().substring(0, 8); // 取前8位作为ID
} catch (Exception e) {
throw new RuntimeException("MD5生成失败", e);
}
}
/**
* 动态创建表
*/
private static void createDynamicTable(String idSuffix) throws SQLException {
String tableName = "t_key_" + idSuffix;
String createTableSQL = String.format(
"CREATE TABLE %s (" +
" id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '主键'," +
" key_value VARCHAR(255) NOT NULL COMMENT '加密键值'," +
" create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间'," +
" expire_time DATETIME COMMENT '过期时间'" +
") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='动态密钥表'",
tableName
);
try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD);
Statement stmt = conn.createStatement()) {
stmt.executeUpdate(createTableSQL);
}
}
}
实现分析:
使用 Instant.now().toEpochMilli() 获取精确到毫秒的当前时间戳,确保时间粒度的唯一性 。
基于Java原生 MessageDigest 类实现,避免第三方依赖 。
将时间戳转换为字节数组后加密,生成128位散列值,再转换为16进制字符串 。
截取前8位作为ID,平衡唯一性与存储空间 。
表名格式为 t_key_ + MD5 ID后缀,符合命名规范 。
表结构包含主键、加密键值字段及时间字段,支持自动生成创建时间 。
指定存储引擎和字符集,确保兼容性与性能 。
使用预编译的字符串格式化生成SQL语句,避免SQL注入风险 。
添加异常处理逻辑,防止因加密失败或数据库连接问题导致程序崩溃 。