解决开源漏洞问题。

This commit is contained in:
chenxudong 2025-10-15 17:55:54 +08:00
parent 6dd0c2939a
commit 1198ea8d02
21 changed files with 68 additions and 236 deletions

View File

@ -12,7 +12,7 @@ import com.electromagnetic.industry.software.common.enums.AdminTypeEnum;
import com.electromagnetic.industry.software.common.pojo.AccessSuccessInfo;
import com.electromagnetic.industry.software.common.pojo.UserLoginInfo;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import com.electromagnetic.industry.software.common.util.TokenUtil;
import com.electromagnetic.industry.software.common.util.UserThreadLocal;
import com.electromagnetic.industry.software.manage.mapper.TokenMapper;
@ -183,7 +183,7 @@ public class LoginInterceptor implements HandlerInterceptor {
if (CollUtil.isEmpty(successInfoList)) {
ElectromagneticResult res = user.getResult();
UserAccessLog userAccessLog = new UserAccessLog()
.setId(IdWorker.getSnowFlakeIdString())
.setId(EleIdCreator.createSnowflakeId())
.setUserId(user.getUserId())
.setAccessStartTime(DateUtil.date(accessStartTime))
.setAccessEndTime(DateUtil.date(accessEndTime))
@ -209,7 +209,7 @@ public class LoginInterceptor implements HandlerInterceptor {
} else {
for (AccessSuccessInfo accessSuccessInfo : successInfoList) {
UserAccessLog userAccessLog = new UserAccessLog()
.setId(IdWorker.getSnowFlakeIdString())
.setId(EleIdCreator.createSnowflakeId())
.setUserId(user.getUserId())
.setAccessStartTime(DateUtil.date(accessStartTime))
.setAccessEndTime(DateUtil.date(accessEndTime))

View File

@ -4,7 +4,7 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -23,6 +23,6 @@ public class EdFileFavorite extends BaseModel {
private String fileId;
public void newInit() {
this.setId(IdWorker.getSnowFlakeIdString());
this.setId(EleIdCreator.createSnowflakeId());
}
}

View File

@ -3,7 +3,7 @@ package com.electromagnetic.industry.software.manage.pojo.models;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.electromagnetic.industry.software.common.util.EleCommonUtil;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@ -127,7 +127,7 @@ public class EdFileInfo extends BaseModel {
private String templateCode;
public void newInit() {
String newFileDbId = IdWorker.getSnowFlakeIdString();
String newFileDbId = EleIdCreator.createSnowflakeId();
String fileTime = EleCommonUtil.getNowTimeStr();
this.setId(newFileDbId);
this.setFileTime(fileTime);

View File

@ -2,7 +2,7 @@ package com.electromagnetic.industry.software.manage.pojo.models;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -31,6 +31,6 @@ public class EdFileRelation extends BaseModel {
private String relationship;
public void newInit() {
this.setId(IdWorker.getSnowFlakeIdString());
this.setId(EleIdCreator.createSnowflakeId());
}
}

View File

@ -3,7 +3,7 @@ package com.electromagnetic.industry.software.manage.pojo.models;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.electromagnetic.industry.software.common.enums.PublishEnum;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -21,7 +21,7 @@ public class EdTagLibrary extends BaseModel {
private Integer isPublished; // 是否已发布0: 未发布, 1: 已发布
public void newInit() {
this.setTagId(IdWorker.getSnowFlakeIdString());
this.setTagId(EleIdCreator.createSnowflakeId());
this.setIsPublished(PublishEnum.UNPUBLISHED.getCode()); //默认未发布
}
}

View File

@ -1,7 +1,7 @@
package com.electromagnetic.industry.software.manage.pojo.models;
import com.baomidou.mybatisplus.annotation.TableName;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -15,6 +15,6 @@ public class FileTagRelation extends BaseModel {
private String tagId;
public void newInit() {
this.setId(IdWorker.getSnowFlakeIdString());
this.setId(EleIdCreator.createSnowflakeId());
}
}

View File

@ -2,7 +2,7 @@ package com.electromagnetic.industry.software.manage.pojo.models;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -26,7 +26,7 @@ public class Role extends BaseModel {
private String roleDesc;
public void newInit() {
this.setId(IdWorker.getSnowFlakeIdString());
this.setId(EleIdCreator.createSnowflakeId());
}
}

View File

@ -2,7 +2,7 @@ package com.electromagnetic.industry.software.manage.pojo.models;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -35,6 +35,6 @@ public class RolePermission extends BaseModel {
private String permissionCode;
public void newInit() {
this.setId(IdWorker.getSnowFlakeIdString());
this.setId(EleIdCreator.createSnowflakeId());
}
}

View File

@ -4,8 +4,8 @@ import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.annotation.TableName;
import com.electromagnetic.industry.software.common.cons.UserConstants;
import com.electromagnetic.industry.software.common.enums.AdminTypeEnum;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.SignUtils;
import com.electromagnetic.industry.software.common.util.EleCommonUtil;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -92,9 +92,9 @@ public class User extends BaseModel {
private String salt;
public void newInit() {
this.setId(IdWorker.getSnowFlakeIdString());
this.setId(EleIdCreator.createSnowflakeId());
this.setSalt(RandomUtil.randomString(16));
this.setUserPwd(SignUtils.MD5(UserConstants.DEFAULT_PASSWORD + this.getSalt()));
this.setUserPwd(EleCommonUtil.getStrMd5(UserConstants.DEFAULT_PASSWORD + this.getSalt()));
this.setIsPublished(UserConstants.DEFAULT_PUBLISH_STATUS);
this.setIsActivated(UserConstants.DEFAULT_ACTIVE_STATUS);
this.setAdminType(AdminTypeEnum.NORMAL.getValue());

View File

@ -2,7 +2,7 @@ package com.electromagnetic.industry.software.manage.pojo.models;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -29,6 +29,6 @@ public class UserRole extends BaseModel {
private String roleId;
public void newInit() {
this.setId(IdWorker.getSnowFlakeIdString());
this.setId(EleIdCreator.createSnowflakeId());
}
}

View File

@ -10,7 +10,7 @@ import com.electromagnetic.industry.software.common.pojo.PageFile;
import com.electromagnetic.industry.software.common.pojo.UserLoginInfo;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.common.util.ElectromagneticResultUtil;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import com.electromagnetic.industry.software.common.util.OfficeFileUtil;
import com.electromagnetic.industry.software.common.util.UserThreadLocal;
import com.electromagnetic.industry.software.manage.config.ElePropertyConfig;
@ -149,7 +149,7 @@ public class ChatService {
StringBuilder stringBuilder = new StringBuilder();
for (Document document : documents) {
Map<String, Object> metadata = Map.of("fileName", file.getOriginalFilename(), "fileMd5", fileMd5);
newDocuments.add(new Document(IdWorker.getSnowFlakeIdString(), Objects.requireNonNull(document.getText()), metadata));
newDocuments.add(new Document(EleIdCreator.createSnowflakeId(), Objects.requireNonNull(document.getText()), metadata));
stringBuilder.append(document.getText());
}
FileUtil.writeString(stringBuilder.toString(), elePropertyConfig.getAiFileUploadStoreDir() + File.separator + fileMd5, Charset.defaultCharset());
@ -158,7 +158,7 @@ public class ChatService {
vectorStore.write(newDocuments);
for (Document document : newDocuments) {
aiFileUploadRecordMapper.insert(new AiFileUploadRecord()
.setId(IdWorker.getSnowFlakeIdString())
.setId(EleIdCreator.createSnowflakeId())
.setVectorId(document.getId())
.setFileSize(file.getSize())
.setFileMd5(fileMd5)
@ -170,7 +170,7 @@ public class ChatService {
public Flux<String> chatStreamStr(QueryDTO queryDTO) {
AiQuestionRecord record = new AiQuestionRecord()
.setQuestion(queryDTO.getMsg())
.setId(IdWorker.getSnowFlakeIdString());
.setId(EleIdCreator.createSnowflakeId());
UserLoginInfo userLoginInfo = new UserLoginInfo();
userLoginInfo.setUserId(queryDTO.getUserId());
UserThreadLocal.set(userLoginInfo);
@ -202,7 +202,7 @@ public class ChatService {
}
public Flux<ChatResponse> chatStreamResponse(QueryDTO queryDTO) {
AiQuestionRecord record = new AiQuestionRecord().setQuestion(queryDTO.getMsg()).setId(IdWorker.getSnowFlakeIdString());
AiQuestionRecord record = new AiQuestionRecord().setQuestion(queryDTO.getMsg()).setId(EleIdCreator.createSnowflakeId());
UserLoginInfo userLoginInfo = new UserLoginInfo();
userLoginInfo.setUserId(queryDTO.getUserId());
UserThreadLocal.set(userLoginInfo);

View File

@ -198,7 +198,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileI
@Override
public ElectromagneticResult<?> createFolder(CreateFolderDTO createFolderDTO, int dataOwnCode) {
Assert.isTrue(EleCommonUtil.isFileNameValid(createFolderDTO.getNewFolderName()), NAME_VALID_MSG);
String folderId = IdWorker.getSnowFlakeIdString();
String folderId = EleIdCreator.createSnowflakeId();
if (DataOwnEnum.isSysCode(dataOwnCode) || DataOwnEnum.isRepoCode(dataOwnCode)) {
List<String> accessibleTree = permissionService.getAccessibleTree();
@ -1034,7 +1034,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileI
.eq(EdFileInfo::getFileName, srcFileInfo.getFileName())
.eq(EdFileInfo::getFileType, srcFileInfo.getFileType()));
Integer maxFileVersion = Collections.max(sameFileInfos, Comparator.comparing(EdFileInfo::getFileVersion)).getFileVersion();
String newFileDbId = IdWorker.getSnowFlakeIdString();
String newFileDbId = EleIdCreator.createSnowflakeId();
String fileTime = EleCommonUtil.getNowTimeStr();
String codePathByDbPath = commonService.getCodePathByDbPath(destFolderInfo.getFilePath());
String fileCode = commonService.createFileCode(codePathByDbPath, srcFileInfo.getFileType(), maxFileVersion + 1, fileTime);
@ -1218,7 +1218,7 @@ public class EdFileInfoServiceImpl extends ServiceImpl<EdFileInfoMapper, EdFileI
.eq(EdFileInfo::getFileType, srcFileInfo.getFileType());
List<EdFileInfo> sameFileInfos = this.baseMapper.selectList(queryWrapper);
Integer maxFileVersion = Collections.max(sameFileInfos, Comparator.comparing(EdFileInfo::getFileVersion)).getFileVersion();
String newFileDbId = IdWorker.getSnowFlakeIdString();
String newFileDbId = EleIdCreator.createSnowflakeId();
String fileTime = EleCommonUtil.getNowTimeStr();
String codePathByDbPath = commonService.getCodePathByDbPath(destFolderInfo.getFilePath());
String fileCode = commonService.createFileCode(codePathByDbPath, srcFileInfo.getFileType(), maxFileVersion + 1, fileTime);

View File

@ -6,7 +6,7 @@ import cn.hutool.core.text.StrFormatter;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.electromagnetic.industry.software.common.enums.EffectFlagEnum;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import com.electromagnetic.industry.software.common.util.UserThreadLocal;
import com.electromagnetic.industry.software.manage.mapper.FileFormatMapper;
import com.electromagnetic.industry.software.manage.pojo.models.FileFormat;
@ -39,7 +39,7 @@ public class FileFormatServiceImpl extends ServiceImpl<FileFormatMapper, FileFor
FileFormat fileFormat = new FileFormat();
fileFormat.setSuffixName(suffixName);
fileFormat.setEffectFlag(EffectFlagEnum.EFFECT.code);
fileFormat.setId(IdWorker.getSnowFlakeIdString());
fileFormat.setId(EleIdCreator.createSnowflakeId());
fileFormat.setSuffixNo(createFileFormatNo(fileFormats.size()));
fileFormat.setCreatedBy(UserThreadLocal.getUserId());
this.baseMapper.insert(fileFormat);

View File

@ -22,7 +22,7 @@ import com.electromagnetic.industry.software.common.enums.EleDataTypeEnum;
import com.electromagnetic.industry.software.common.exception.BizException;
import com.electromagnetic.industry.software.common.pojo.RespPageVO;
import com.electromagnetic.industry.software.common.util.EleCommonUtil;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import com.electromagnetic.industry.software.common.util.UserThreadLocal;
import com.electromagnetic.industry.software.manage.config.ElePropertyConfig;
import com.electromagnetic.industry.software.manage.mapper.ImportPrjInfoMapper;
@ -91,7 +91,7 @@ public class ImportPrjServiceImpl extends ServiceImpl<ImportPrjInfoMapper, Impor
// 如果是目录且不是最后一个元素
boolean isDirectory = i < pathParts.length - 1 || entry.isDirectory();
if (!pathIdMap.containsKey(currentPath)) {
String newId = IdWorker.getSnowFlakeIdString();
String newId = EleIdCreator.createSnowflakeId();
pathIdMap.put(currentPath, newId);
String findIdPath = findIdPath(parentId, itemIdMap);
String filePath = StrUtil.isEmpty(findIdPath) ? newId : findIdPath + ElectromagneticConstants.MYSQL_FILE_PATH_SPLIT + newId;

View File

@ -12,7 +12,7 @@ import com.electromagnetic.industry.software.common.pojo.RespPageVO;
import com.electromagnetic.industry.software.common.resp.ElectromagneticResult;
import com.electromagnetic.industry.software.common.util.EleCommonUtil;
import com.electromagnetic.industry.software.common.util.ElectromagneticResultUtil;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import com.electromagnetic.industry.software.manage.mapper.ImportTableDataMapper;
import com.electromagnetic.industry.software.manage.mapper.ImportTableInfoMapper;
import com.electromagnetic.industry.software.manage.pojo.models.ImportTableData;
@ -45,7 +45,7 @@ public class ImportTableServiceImpl implements ImportTableService {
@Override
public String addTableInfo(String relatedId, Map<Integer, Object> tableHeader) {
String id = IdWorker.getSnowFlakeIdString();
String id = EleIdCreator.createSnowflakeId();
ImportTableInfo importTableInfo = new ImportTableInfo()
.setId(id)
.setTableHeader(JSONUtil.toJsonStr(tableHeader))
@ -107,7 +107,7 @@ public class ImportTableServiceImpl implements ImportTableService {
@Override
public String addTableData(String tableInfoId, String tableData) {
String id = IdWorker.getSnowFlakeIdString();
String id = EleIdCreator.createSnowflakeId();
ImportTableData importTableData = new ImportTableData().setId(id).setTableInfoId(tableInfoId).setData(tableData);
importTableDataMapper.insert(importTableData);
return id;

View File

@ -126,7 +126,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
public Boolean matchPassword(User user, String password) {
String salt = user.getSalt();
String encodePwd = SignUtils.MD5(password + salt);
String encodePwd = EleCommonUtil.getStrMd5(password + salt);
return user.getUserPwd().equals(encodePwd);
}
@ -247,7 +247,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
singleUserResponse.setRoleList(roleList);
// 检查密码是否和初始密码相同
if (user.getUserPwd().equals(SignUtils.MD5(UserConstants.DEFAULT_PASSWORD + user.getSalt()))) {
if (user.getUserPwd().equals(EleCommonUtil.getStrMd5(UserConstants.DEFAULT_PASSWORD + user.getSalt()))) {
singleUserResponse.setIsDefaultPwd(1);
} else {
singleUserResponse.setIsDefaultPwd(0);
@ -327,7 +327,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
Assert.isTrue(!decodeNewPwd.contains(user.getUserAccount()), "密码最小长度为8必须至少包含一个大写字母、一个小写字母、一个特殊字符、数字、不可包含账号");
Assert.isTrue(EleCommonUtil.isPwdValid(decodeNewPwd), "密码最小长度为8必须至少包含一个大写字母、一个小写字母、一个特殊字符、数字、不可包含账号");
user.setUserPwd(SignUtils.MD5(decodeNewPwd + user.getSalt()));
user.setUserPwd(EleCommonUtil.getStrMd5(decodeNewPwd + user.getSalt()));
boolean success = this.updateById(user);
UserThreadLocal.setSuccessInfo("", userId, StrFormatter.format("修改了用户密码"));
return ElectromagneticResultUtil.success(success);
@ -344,7 +344,7 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
User user = this.getById(userId);
Assert.notNull(user, StrFormatter.format("用户ID {} 无效", userId));
user.setUserPwd(SignUtils.MD5(UserConstants.DEFAULT_PASSWORD + user.getSalt()));
user.setUserPwd(EleCommonUtil.getStrMd5(UserConstants.DEFAULT_PASSWORD + user.getSalt()));
boolean success = this.updateById(user);
if (success) {

View File

@ -18,7 +18,7 @@ import com.electromagnetic.industry.software.common.enums.UserOperationModuleEnu
import com.electromagnetic.industry.software.common.pojo.BackupFileResLog;
import com.electromagnetic.industry.software.common.pojo.UserLoginInfo;
import com.electromagnetic.industry.software.common.util.EleCommonUtil;
import com.electromagnetic.industry.software.common.util.IdWorker;
import com.electromagnetic.industry.software.common.util.EleIdCreator;
import com.electromagnetic.industry.software.common.util.UserThreadLocal;
import com.electromagnetic.industry.software.manage.config.ElePropertyConfig;
import com.electromagnetic.industry.software.manage.mapper.EdFileInfoMapper;
@ -109,7 +109,7 @@ public class BackupTask {
BackupFileResLog resLog = backupHandler.backupFiles(fileSysPath);
long endTime = System.currentTimeMillis();
FileBackupLog backupLog = new FileBackupLog()
.setId(IdWorker.getSnowFlakeIdString())
.setId(EleIdCreator.createSnowflakeId())
.setFileId(edFileInfo.getId())
.setFileCode(edFileInfo.getFileCode())
.setBackupSuccess(resLog.getBackupSuccess())
@ -154,7 +154,7 @@ public class BackupTask {
for (File file : files) {
fileSystemService.deleteFile(file.getAbsolutePath());
UserAccessLog userAccessLog = new UserAccessLog()
.setId(IdWorker.getSnowFlakeIdString())
.setId(EleIdCreator.createSnowflakeId())
.setUserId("")
.setAccessStartTime(new Date())
.setAccessEndTime(new Date())
@ -212,7 +212,7 @@ public class BackupTask {
List<FileBackupLog> failBacks = fileBackupLogs.stream().filter(FileBackupLog::isBackupSuccess).toList();
if (CollUtil.isEmpty(failBacks)) {
FileBackupLog backupLog = new FileBackupLog()
.setId(IdWorker.getSnowFlakeIdString())
.setId(EleIdCreator.createSnowflakeId())
.setFileId(Base64.encode(fileName))
.setFileCode(Base64.encode(fileName))
.setBackupSuccess(resLog.getBackupSuccess())

View File

@ -2,7 +2,9 @@ package com.electromagnetic.industry.software.common.util;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.crypto.symmetric.AES;
import com.electromagnetic.industry.software.common.exception.BizException;
import com.electromagnetic.industry.software.common.parse.*;
@ -184,4 +186,9 @@ public final class EleCommonUtil {
return startValid && endValid && orderValid;
}
public static String getStrMd5(String str) {
byte[] md5Bytes = DigestUtil.md5(str);
return HexUtil.encodeHexStr(md5Bytes);
}
}

View File

@ -0,0 +1,15 @@
package com.electromagnetic.industry.software.common.util;
import cn.hutool.core.util.IdUtil;
public class EleIdCreator {
public static String createSnowflakeId() {
return createSnowflakeIdNum() + "";
}
public static long createSnowflakeIdNum() {
return IdUtil.getSnowflake(1, 1).nextId();
}
}

View File

@ -1,152 +0,0 @@
package com.electromagnetic.industry.software.common.util;
import java.lang.management.ManagementFactory;
import java.net.InetAddress;
import java.net.NetworkInterface;
public class IdWorker {
// 时间起始标记点作为基准一般取系统的最近时间一旦确定不能变动
private final static long twepoch = 1288834974657L;
// 机器标识位数
private final static long workerIdBits = 5L;
// 数据中心标识位数
private final static long datacenterIdBits = 5L;
// 机器ID最大值
private final static long maxWorkerId = -1L ^ (-1L << workerIdBits);
// 数据中心ID最大值
private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
// 毫秒内自增位
private final static long sequenceBits = 12L;
// 机器ID偏左移12位
private final static long workerIdShift = sequenceBits;
// 数据中心ID左移17位
private final static long datacenterIdShift = sequenceBits + workerIdBits;
// 时间毫秒左移22位
private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
private final static long sequenceMask = -1L ^ (-1L << sequenceBits);
private static final IdWorker idWorker = new IdWorker();
/* 上次生产id时间戳 */
private static long lastTimestamp = -1L;
private final long workerId;
// 数据标识id部分
private final long datacenterId;
// 0并发控制
private long sequence = 0L;
public IdWorker() {
this.datacenterId = getDatacenterId(maxDatacenterId);
this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);
}
/**
* @param workerId 工作机器ID
* @param datacenterId 序列号
*/
public IdWorker(long workerId, long datacenterId) {
if (workerId > maxWorkerId || workerId < 0) {
throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
}
if (datacenterId > maxDatacenterId || datacenterId < 0) {
throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
}
this.workerId = workerId;
this.datacenterId = datacenterId;
}
/**
* <p>
* 获取 maxWorkerId
* </p>
*/
protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {
StringBuffer mpid = new StringBuffer();
mpid.append(datacenterId);
String name = ManagementFactory.getRuntimeMXBean().getName();
if (!name.isEmpty()) {
/*
* GET jvmPid
*/
mpid.append(name.split("@")[0]);
}
/*
* MAC + PID hashcode 获取16个低位
*/
return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);
}
/**
* <p>
* 数据标识id部分
* </p>
*/
protected static long getDatacenterId(long maxDatacenterId) {
long id = 0L;
try {
InetAddress ip = InetAddress.getLocalHost();
NetworkInterface network = NetworkInterface.getByInetAddress(ip);
if (network == null) {
id = 1L;
} else {
byte[] mac = network.getHardwareAddress();
id = ((0x000000FF & (long) mac[mac.length - 1])
| (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;
id = id % (maxDatacenterId + 1);
}
} catch (Exception e) {
System.out.println(" getDatacenterId: " + e.getMessage());
}
return id;
}
public static long getSnowFlakeId() {
return idWorker.nextId();
}
public static String getSnowFlakeIdString() {
return String.valueOf(getSnowFlakeId());
}
/**
* 获取下一个ID
*
* @return
*/
public synchronized long nextId() {
long timestamp = timeGen();
if (timestamp < lastTimestamp) {
throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
}
if (lastTimestamp == timestamp) {
// 当前毫秒内+1
sequence = (sequence + 1) & sequenceMask;
if (sequence == 0) {
// 当前毫秒内计数满了则等待下一秒
timestamp = tilNextMillis(lastTimestamp);
}
} else {
sequence = 0L;
}
lastTimestamp = timestamp;
// ID偏移组合生成最终的ID并返回ID
long nextId = ((timestamp - twepoch) << timestampLeftShift)
| (datacenterId << datacenterIdShift)
| (workerId << workerIdShift) | sequence;
return nextId;
}
private long tilNextMillis(final long lastTimestamp) {
long timestamp = this.timeGen();
while (timestamp <= lastTimestamp) {
timestamp = this.timeGen();
}
return timestamp;
}
private long timeGen() {
return System.currentTimeMillis();
}
}

View File

@ -1,38 +0,0 @@
package com.electromagnetic.industry.software.common.util;
import lombok.extern.slf4j.Slf4j;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
@Slf4j
public class SignUtils {
/**
* 获取MD5加密后的字符串
*
* @param str 加密前的字符串
* @return
*/
public static String MD5(String str) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.reset();
md.update(str.getBytes(StandardCharsets.UTF_8));
byte[] byteArray = md.digest();
StringBuffer md5StrBuff = new StringBuffer();
for (int i = 0; i < byteArray.length; i++) {
if (Integer.toHexString(0xFF & byteArray[i]).length() == 1) {
md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
} else {
md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
}
}
return md5StrBuff.toString();
} catch (Exception e) {
log.error(e.getMessage(), e);
return null;
}
}
}