src/main/java/com/ard/alarm/apponekey/controller/ArdAlarmApponekeyController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/alarm/apponekey/domain/ArdAlarmApponekey.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/alarm/apponekey/mapper/ArdAlarmApponekeyMapper.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/alarm/apponekey/service/IArdAlarmApponekeyService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/alarm/apponekey/service/impl/ArdAlarmApponekeyServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/hiksdk/util/minio/MinioUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/http/AjaxResult.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/http/HttpStatus.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/uuid/IdUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/ard/utils/uuid/UUID.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/ard/alarm/apponekey/controller/ArdAlarmApponekeyController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,40 @@ package com.ard.alarm.apponekey.controller; import com.ard.utils.hiksdk.util.minio.MinioUtils; import com.ard.utils.http.AjaxResult; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import com.ard.alarm.apponekey.domain.ArdAlarmApponekey; import com.ard.alarm.apponekey.service.IArdAlarmApponekeyService; import org.springframework.web.multipart.MultipartFile; /** * appä¸é®æ¥è¦Controller * * @author ard * @date 2023-07-21 */ @RestController @RequestMapping("/alarm/apponekey") public class ArdAlarmApponekeyController { @Autowired private IArdAlarmApponekeyService ardAlarmApponekeyService; /** * æ°å¢appä¸é®æ¥è¦ */ @PostMapping public AjaxResult add(String userId,String name, Double longitude,Double latitude,Double altitude,MultipartFile file) { String url = MinioUtils.putObjectAndGetUrl("record", file); ArdAlarmApponekey ardAlarmApponekey =new ArdAlarmApponekey(); ardAlarmApponekey.setUserId(userId); ardAlarmApponekey.setName(name); ardAlarmApponekey.setLongitude(longitude); ardAlarmApponekey.setLatitude(latitude); ardAlarmApponekey.setAltitude(altitude); ardAlarmApponekey.setRecordUrl(url); return AjaxResult.success(ardAlarmApponekeyService.insertArdAlarmApponekey(ardAlarmApponekey)); } } src/main/java/com/ard/alarm/apponekey/domain/ArdAlarmApponekey.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,40 @@ package com.ard.alarm.apponekey.domain; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.util.Date; /** * appä¸é®æ¥è¦å¯¹è±¡ ard_alarm_apponekey * * @author ard * @date 2023-07-21 */ @Data public class ArdAlarmApponekey { private static final long serialVersionUID = 1L; /** ID */ private String id; /** appç¨æ·ID */ private String userId; /** appç¨æ·å§å */ private String name; /** ç»åº¦ */ private Double longitude; /** 纬度 */ private Double latitude; /** é«å± */ private Double altitude; /** å½åurl */ private String recordUrl; /** æ¥æ¶å建æ¶é´ */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; } src/main/java/com/ard/alarm/apponekey/mapper/ArdAlarmApponekeyMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,63 @@ package com.ard.alarm.apponekey.mapper; import java.util.List; import com.ard.alarm.apponekey.domain.ArdAlarmApponekey; import org.apache.ibatis.annotations.Mapper; /** * appä¸é®æ¥è¦Mapperæ¥å£ * * @author ard * @date 2023-07-21 */ @Mapper public interface ArdAlarmApponekeyMapper { /** * æ¥è¯¢appä¸é®æ¥è¦ * * @param id appä¸é®æ¥è¦ä¸»é® * @return appä¸é®æ¥è¦ */ public ArdAlarmApponekey selectArdAlarmApponekeyById(String id); /** * æ¥è¯¢appä¸é®æ¥è¦å表 * * @param ardAlarmApponekey appä¸é®æ¥è¦ * @return appä¸é®æ¥è¦éå */ public List<ArdAlarmApponekey> selectArdAlarmApponekeyList(ArdAlarmApponekey ardAlarmApponekey); /** * æ°å¢appä¸é®æ¥è¦ * * @param ardAlarmApponekey appä¸é®æ¥è¦ * @return ç»æ */ public int insertArdAlarmApponekey(ArdAlarmApponekey ardAlarmApponekey); /** * ä¿®æ¹appä¸é®æ¥è¦ * * @param ardAlarmApponekey appä¸é®æ¥è¦ * @return ç»æ */ public int updateArdAlarmApponekey(ArdAlarmApponekey ardAlarmApponekey); /** * å é¤appä¸é®æ¥è¦ * * @param id appä¸é®æ¥è¦ä¸»é® * @return ç»æ */ public int deleteArdAlarmApponekeyById(String id); /** * æ¹éå é¤appä¸é®æ¥è¦ * * @param ids éè¦å é¤çæ°æ®ä¸»é®éå * @return ç»æ */ public int deleteArdAlarmApponekeyByIds(String[] ids); } src/main/java/com/ard/alarm/apponekey/service/IArdAlarmApponekeyService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,61 @@ package com.ard.alarm.apponekey.service; import java.util.List; import com.ard.alarm.apponekey.domain.ArdAlarmApponekey; /** * appä¸é®æ¥è¦Serviceæ¥å£ * * @author ard * @date 2023-07-21 */ public interface IArdAlarmApponekeyService { /** * æ¥è¯¢appä¸é®æ¥è¦ * * @param id appä¸é®æ¥è¦ä¸»é® * @return appä¸é®æ¥è¦ */ public ArdAlarmApponekey selectArdAlarmApponekeyById(String id); /** * æ¥è¯¢appä¸é®æ¥è¦å表 * * @param ardAlarmApponekey appä¸é®æ¥è¦ * @return appä¸é®æ¥è¦éå */ public List<ArdAlarmApponekey> selectArdAlarmApponekeyList(ArdAlarmApponekey ardAlarmApponekey); /** * æ°å¢appä¸é®æ¥è¦ * * @param ardAlarmApponekey appä¸é®æ¥è¦ * @return ç»æ */ public int insertArdAlarmApponekey(ArdAlarmApponekey ardAlarmApponekey); /** * ä¿®æ¹appä¸é®æ¥è¦ * * @param ardAlarmApponekey appä¸é®æ¥è¦ * @return ç»æ */ public int updateArdAlarmApponekey(ArdAlarmApponekey ardAlarmApponekey); /** * æ¹éå é¤appä¸é®æ¥è¦ * * @param ids éè¦å é¤çappä¸é®æ¥è¦ä¸»é®éå * @return ç»æ */ public int deleteArdAlarmApponekeyByIds(String[] ids); /** * å é¤appä¸é®æ¥è¦ä¿¡æ¯ * * @param id appä¸é®æ¥è¦ä¸»é® * @return ç»æ */ public int deleteArdAlarmApponekeyById(String id); } src/main/java/com/ard/alarm/apponekey/service/impl/ArdAlarmApponekeyServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,111 @@ package com.ard.alarm.apponekey.service.impl; import java.util.Date; import java.util.List; import com.alibaba.fastjson2.JSON; import com.ard.utils.mqtt.MqttConsumer; import com.ard.utils.uuid.IdUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import com.ard.alarm.apponekey.mapper.ArdAlarmApponekeyMapper; import com.ard.alarm.apponekey.domain.ArdAlarmApponekey; import com.ard.alarm.apponekey.service.IArdAlarmApponekeyService; import javax.annotation.Resource; import static jdk.nashorn.internal.runtime.regexp.joni.Config.log; /** * appä¸é®æ¥è¦Serviceä¸å¡å±å¤ç * * @author ard * @date 2023-07-21 */ @Service @Slf4j(topic = "apponekey") public class ArdAlarmApponekeyServiceImpl implements IArdAlarmApponekeyService { @Resource private ArdAlarmApponekeyMapper ardAlarmApponekeyMapper; /** * æ¥è¯¢appä¸é®æ¥è¦ * * @param id appä¸é®æ¥è¦ä¸»é® * @return appä¸é®æ¥è¦ */ @Override public ArdAlarmApponekey selectArdAlarmApponekeyById(String id) { return ardAlarmApponekeyMapper.selectArdAlarmApponekeyById(id); } /** * æ¥è¯¢appä¸é®æ¥è¦å表 * * @param ardAlarmApponekey appä¸é®æ¥è¦ * @return appä¸é®æ¥è¦ */ @Override public List<ArdAlarmApponekey> selectArdAlarmApponekeyList(ArdAlarmApponekey ardAlarmApponekey) { return ardAlarmApponekeyMapper.selectArdAlarmApponekeyList(ardAlarmApponekey); } /** * æ°å¢appä¸é®æ¥è¦ * * @param ardAlarmApponekey appä¸é®æ¥è¦ * @return ç»æ */ @Override public int insertArdAlarmApponekey(ArdAlarmApponekey ardAlarmApponekey) { try { ardAlarmApponekey.setId(IdUtils.fastSimpleUUID()); ardAlarmApponekey.setCreateTime(new Date()); printLog(ardAlarmApponekey); MqttConsumer.publish(2, false, "apponekey", JSON.toJSONString(ardAlarmApponekey)); return 1; } catch (Exception ex) { log.error("ä¸é®æ¥è¦å¤çå¼å¸¸:" + ex.getMessage()); return 0; } } private void printLog(ArdAlarmApponekey ardAlarmApponekey) { log.info("æ¶å°æ°æ®:" + "ãIDã" + ardAlarmApponekey.getId() + "ãuserIdã" + ardAlarmApponekey.getUserId() + "ãç»åº¦ã" + ardAlarmApponekey.getLongitude() + "ã纬度ã" + ardAlarmApponekey.getLatitude() + "ãé«å±ã" + ardAlarmApponekey.getAltitude() + "ãå建æ¶é´ã" + ardAlarmApponekey.getCreateTime()); } /** * ä¿®æ¹appä¸é®æ¥è¦ * * @param ardAlarmApponekey appä¸é®æ¥è¦ * @return ç»æ */ @Override public int updateArdAlarmApponekey(ArdAlarmApponekey ardAlarmApponekey) { return ardAlarmApponekeyMapper.updateArdAlarmApponekey(ardAlarmApponekey); } /** * æ¹éå é¤appä¸é®æ¥è¦ * * @param ids éè¦å é¤çappä¸é®æ¥è¦ä¸»é® * @return ç»æ */ @Override public int deleteArdAlarmApponekeyByIds(String[] ids) { return ardAlarmApponekeyMapper.deleteArdAlarmApponekeyByIds(ids); } /** * å é¤appä¸é®æ¥è¦ä¿¡æ¯ * * @param id appä¸é®æ¥è¦ä¸»é® * @return ç»æ */ @Override public int deleteArdAlarmApponekeyById(String id) { return ardAlarmApponekeyMapper.deleteArdAlarmApponekeyById(id); } } src/main/java/com/ard/utils/hiksdk/util/minio/MinioUtils.java
@@ -154,7 +154,7 @@ //æä»¶å String originalFilename = file.getOriginalFilename(); //æ°çæä»¶å String fileName = UUID.randomUUID().toString().replace("-", "") + originalFilename; String fileName = UUID.randomUUID().toString().replace("-", "") +"_"+ originalFilename; try { InputStream inputStream = file.getInputStream(); /*ä¸ä¼ 对象*/ @@ -170,10 +170,13 @@ /*è·åurl*/ GetPresignedObjectUrlArgs getPresignedObjectUrlArgs = GetPresignedObjectUrlArgs .builder() .method(Method.GET) .bucket(bucketName) .object(fileName) .build(); return MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); String presignedObjectUrl = MinioClientSingleton.getMinioClient().getPresignedObjectUrl(getPresignedObjectUrlArgs); String ObjectUrl = presignedObjectUrl.substring(0, presignedObjectUrl.indexOf("?")); return ObjectUrl; } catch (Exception ex) { log.error("ä¸ä¼ 对象è¿åurlå¼å¸¸ï¼" + ex.getMessage()); } src/main/java/com/ard/utils/http/AjaxResult.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,204 @@ package com.ard.utils.http; import java.util.HashMap; /** * æä½æ¶æ¯æé * * @author ruoyi */ public class AjaxResult extends HashMap<String, Object> { private static final long serialVersionUID = 1L; /** ç¶æç */ public static final String CODE_TAG = "code"; /** è¿åå 容 */ public static final String MSG_TAG = "msg"; /** æ°æ®å¯¹è±¡ */ public static final String DATA_TAG = "data"; /** * åå§åä¸ä¸ªæ°å建ç AjaxResult 对象ï¼ä½¿å ¶è¡¨ç¤ºä¸ä¸ªç©ºæ¶æ¯ã */ public AjaxResult() { } /** * åå§åä¸ä¸ªæ°å建ç AjaxResult 对象 * * @param code ç¶æç * @param msg è¿åå 容 */ public AjaxResult(int code, String msg) { super.put(CODE_TAG, code); super.put(MSG_TAG, msg); } /** * åå§åä¸ä¸ªæ°å建ç AjaxResult 对象 * * @param code ç¶æç * @param msg è¿åå 容 * @param data æ°æ®å¯¹è±¡ */ public AjaxResult(int code, String msg, Object data) { super.put(CODE_TAG, code); super.put(MSG_TAG, msg); if (data!=null) { super.put(DATA_TAG, data); } } /** * è¿åæåæ¶æ¯ * * @return æåæ¶æ¯ */ public static AjaxResult success() { return AjaxResult.success("æä½æå"); } /** * è¿åæåæ°æ® * * @return æåæ¶æ¯ */ public static AjaxResult success(Object data) { return AjaxResult.success("æä½æå", data); } /** * è¿åæåæ¶æ¯ * * @param msg è¿åå 容 * @return æåæ¶æ¯ */ public static AjaxResult success(String msg) { return AjaxResult.success(msg, null); } /** * è¿åæåæ¶æ¯ * * @param msg è¿åå 容 * @param data æ°æ®å¯¹è±¡ * @return æåæ¶æ¯ */ public static AjaxResult success(String msg, Object data) { return new AjaxResult(HttpStatus.SUCCESS, msg, data); } /** * è¿åè¦åæ¶æ¯ * * @param msg è¿åå 容 * @return è¦åæ¶æ¯ */ public static AjaxResult warn(String msg) { return AjaxResult.warn(msg, null); } /** * è¿åè¦åæ¶æ¯ * * @param msg è¿åå 容 * @param data æ°æ®å¯¹è±¡ * @return è¦åæ¶æ¯ */ public static AjaxResult warn(String msg, Object data) { return new AjaxResult(HttpStatus.WARN, msg, data); } /** * è¿åéè¯¯æ¶æ¯ * * @return éè¯¯æ¶æ¯ */ public static AjaxResult error() { return AjaxResult.error("æä½å¤±è´¥"); } /** * è¿åéè¯¯æ¶æ¯ * * @param msg è¿åå 容 * @return éè¯¯æ¶æ¯ */ public static AjaxResult error(String msg) { return AjaxResult.error(msg, null); } /** * è¿åéè¯¯æ¶æ¯ * * @param msg è¿åå 容 * @param data æ°æ®å¯¹è±¡ * @return éè¯¯æ¶æ¯ */ public static AjaxResult error(String msg, Object data) { return new AjaxResult(HttpStatus.ERROR, msg, data); } /** * è¿åéè¯¯æ¶æ¯ * * @param code ç¶æç * @param msg è¿åå 容 * @return éè¯¯æ¶æ¯ */ public static AjaxResult error(int code, String msg) { return new AjaxResult(code, msg, null); } /** * æ¹ä¾¿é¾å¼è°ç¨ * * @param key é® * @param value å¼ * @return æ°æ®å¯¹è±¡ */ @Override public AjaxResult put(String key, Object value) { super.put(key, value); return this; } /** * ååºè¿åç»æ * * @param rows å½±åè¡æ° * @return æä½ç»æ */ public static AjaxResult toAjax(int rows) { return rows > 0 ? AjaxResult.success() : AjaxResult.error(); } /** * ååºè¿åç»æ * * @param result ç»æ * @return æä½ç»æ */ public static AjaxResult toAjax(boolean result) { return result ? success() : error(); } } src/main/java/com/ard/utils/http/HttpStatus.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,95 @@ package com.ard.utils.http; /** * è¿åç¶æç * * @author ruoyi */ public class HttpStatus { /** * æä½æå */ public static final int SUCCESS = 200; /** * 对象å建æå */ public static final int CREATED = 201; /** * 请æ±å·²ç»è¢«æ¥å */ public static final int ACCEPTED = 202; /** * æä½å·²ç»æ§è¡æåï¼ä½æ¯æ²¡æè¿åæ°æ® */ public static final int NO_CONTENT = 204; /** * èµæºå·²è¢«ç§»é¤ */ public static final int MOVED_PERM = 301; /** * éå®å */ public static final int SEE_OTHER = 303; /** * èµæºæ²¡æè¢«ä¿®æ¹ */ public static final int NOT_MODIFIED = 304; /** * åæ°å表é误ï¼ç¼ºå°ï¼æ ¼å¼ä¸å¹é ï¼ */ public static final int BAD_REQUEST = 400; /** * æªææ */ public static final int UNAUTHORIZED = 401; /** * 访é®åéï¼ææè¿æ */ public static final int FORBIDDEN = 403; /** * èµæºï¼æå¡æªæ¾å° */ public static final int NOT_FOUND = 404; /** * ä¸å 许çhttpæ¹æ³ */ public static final int BAD_METHOD = 405; /** * èµæºå²çªï¼æè èµæºè¢«é */ public static final int CONFLICT = 409; /** * 䏿¯æçæ°æ®ï¼åªä½ç±»å */ public static final int UNSUPPORTED_TYPE = 415; /** * ç³»ç»å é¨é误 */ public static final int ERROR = 500; /** * æ¥å£æªå®ç° */ public static final int NOT_IMPLEMENTED = 501; /** * ç³»ç»è¦åæ¶æ¯ */ public static final int WARN = 601; } src/main/java/com/ard/utils/uuid/IdUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,50 @@ package com.ard.utils.uuid; /** * IDçæå¨å·¥å ·ç±» * * @author ruoyi */ public class IdUtils { /** * è·åéæºUUID * * @return éæºUUID */ public static String randomUUID() { return UUID.randomUUID().toString(); } /** * ç®åçUUIDï¼å»æäºæ¨ªçº¿ * * @return ç®åçUUIDï¼å»æäºæ¨ªçº¿ */ public static String simpleUUID() { return UUID.randomUUID().toString(true); } /** * è·åéæºUUIDï¼ä½¿ç¨æ§è½æ´å¥½çThreadLocalRandomçæUUID * * @return éæºUUID */ public static String fastUUID() { return UUID.fastUUID().toString(); } /** * ç®åçUUIDï¼å»æäºæ¨ªçº¿ï¼ä½¿ç¨æ§è½æ´å¥½çThreadLocalRandomçæUUID * * @return ç®åçUUIDï¼å»æäºæ¨ªçº¿ */ public static String fastSimpleUUID() { return UUID.fastUUID().toString(true); } } src/main/java/com/ard/utils/uuid/UUID.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,485 @@ package com.ard.utils.uuid; import com.sun.xml.internal.ws.util.UtilException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Random; import java.util.concurrent.ThreadLocalRandom; /** * æä¾éç¨å¯ä¸è¯å«ç ï¼universally unique identifierï¼ï¼UUIDï¼å®ç° * * @author ruoyi */ public final class UUID implements java.io.Serializable, Comparable<UUID> { private static final long serialVersionUID = -1185015143654744140L; /** * SecureRandom çåä¾ * */ private static class Holder { static final SecureRandom numberGenerator = getSecureRandom(); } /** æ¤UUIDçæé«64ææä½ */ private final long mostSigBits; /** æ¤UUIDçæä½64ææä½ */ private final long leastSigBits; /** * ç§ææé * * @param data æ°æ® */ private UUID(byte[] data) { long msb = 0; long lsb = 0; assert data.length == 16 : "data must be 16 bytes in length"; for (int i = 0; i < 8; i++) { msb = (msb << 8) | (data[i] & 0xff); } for (int i = 8; i < 16; i++) { lsb = (lsb << 8) | (data[i] & 0xff); } this.mostSigBits = msb; this.leastSigBits = lsb; } /** * ä½¿ç¨æå®çæ°æ®æé æ°ç UUIDã * * @param mostSigBits ç¨äº {@code UUID} çæé«ææ 64 ä½ * @param leastSigBits ç¨äº {@code UUID} çæä½ææ 64 ä½ */ public UUID(long mostSigBits, long leastSigBits) { this.mostSigBits = mostSigBits; this.leastSigBits = leastSigBits; } /** * è·åç±»å 4ï¼ä¼ªéæºçæçï¼UUID çéæå·¥åã 使ç¨å å¯çæ¬å°çº¿ç¨ä¼ªéæºæ°çæå¨çæè¯¥ UUIDã * * @return éæºçæç {@code UUID} */ public static UUID fastUUID() { return randomUUID(false); } /** * è·åç±»å 4ï¼ä¼ªéæºçæçï¼UUID çéæå·¥åã 使ç¨å å¯çå¼ºä¼ªéæºæ°çæå¨çæè¯¥ UUIDã * * @return éæºçæç {@code UUID} */ public static UUID randomUUID() { return randomUUID(true); } /** * è·åç±»å 4ï¼ä¼ªéæºçæçï¼UUID çéæå·¥åã 使ç¨å å¯çå¼ºä¼ªéæºæ°çæå¨çæè¯¥ UUIDã * * @param isSecure æ¯å¦ä½¿ç¨{@link SecureRandom}妿æ¯å¯ä»¥è·å¾æ´å®å ¨çéæºç ï¼å¦åå¯ä»¥å¾å°æ´å¥½çæ§è½ * @return éæºçæç {@code UUID} */ public static UUID randomUUID(boolean isSecure) { final Random ng = isSecure ? Holder.numberGenerator : getRandom(); byte[] randomBytes = new byte[16]; ng.nextBytes(randomBytes); randomBytes[6] &= 0x0f; /* clear version */ randomBytes[6] |= 0x40; /* set to version 4 */ randomBytes[8] &= 0x3f; /* clear variant */ randomBytes[8] |= 0x80; /* set to IETF variant */ return new UUID(randomBytes); } /** * æ ¹æ®æå®çåèæ°ç»è·åç±»å 3ï¼åºäºåç§°çï¼UUID çéæå·¥åã * * @param name ç¨äºæé UUID çåèæ°ç»ã * * @return æ ¹æ®æå®æ°ç»çæç {@code UUID} */ public static UUID nameUUIDFromBytes(byte[] name) { MessageDigest md; try { md = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException nsae) { throw new InternalError("MD5 not supported"); } byte[] md5Bytes = md.digest(name); md5Bytes[6] &= 0x0f; /* clear version */ md5Bytes[6] |= 0x30; /* set to version 3 */ md5Bytes[8] &= 0x3f; /* clear variant */ md5Bytes[8] |= 0x80; /* set to IETF variant */ return new UUID(md5Bytes); } /** * æ ¹æ® {@link #toString()} æ¹æ³ä¸æè¿°çå符串æ å表示形å¼å建{@code UUID}ã * * @param name æå® {@code UUID} å符串 * @return å ·ææå®å¼ç {@code UUID} * @throws IllegalArgumentException 妿 name ä¸ {@link #toString} ä¸æè¿°çå符串表示形å¼ä¸ç¬¦æåºæ¤å¼å¸¸ * */ public static UUID fromString(String name) { String[] components = name.split("-"); if (components.length != 5) { throw new IllegalArgumentException("Invalid UUID string: " + name); } for (int i = 0; i < 5; i++) { components[i] = "0x" + components[i]; } long mostSigBits = Long.decode(components[0]).longValue(); mostSigBits <<= 16; mostSigBits |= Long.decode(components[1]).longValue(); mostSigBits <<= 16; mostSigBits |= Long.decode(components[2]).longValue(); long leastSigBits = Long.decode(components[3]).longValue(); leastSigBits <<= 48; leastSigBits |= Long.decode(components[4]).longValue(); return new UUID(mostSigBits, leastSigBits); } /** * è¿åæ¤ UUID ç 128 ä½å¼ä¸çæä½ææ 64 ä½ã * * @return æ¤ UUID ç 128 ä½å¼ä¸çæä½ææ 64 ä½ã */ public long getLeastSignificantBits() { return leastSigBits; } /** * è¿åæ¤ UUID ç 128 ä½å¼ä¸çæé«ææ 64 ä½ã * * @return æ¤ UUID ç 128 ä½å¼ä¸æé«ææ 64 ä½ã */ public long getMostSignificantBits() { return mostSigBits; } /** * 䏿¤ {@code UUID} ç¸å ³èççæ¬å·. çæ¬å·æè¿°æ¤ {@code UUID} æ¯å¦ä½çæçã * <p> * çæ¬å·å ·æä»¥ä¸å«æ: * <ul> * <li>1 åºäºæ¶é´ç UUID * <li>2 DCE å®å ¨ UUID * <li>3 åºäºåç§°ç UUID * <li>4 éæºçæç UUID * </ul> * * @return æ¤ {@code UUID} ççæ¬å· */ public int version() { // Version is bits masked by 0x000000000000F000 in MS long return (int) ((mostSigBits >> 12) & 0x0f); } /** * 䏿¤ {@code UUID} ç¸å ³èçåä½å·ãåä½å·æè¿° {@code UUID} çå¸å±ã * <p> * åä½å·å ·æä»¥ä¸å«æï¼ * <ul> * <li>0 为 NCS ååå ¼å®¹ä¿ç * <li>2 <a href="http://www.ietf.org/rfc/rfc4122.txt">IETF RFC 4122</a>(Leach-Salz), ç¨äºæ¤ç±» * <li>6 ä¿çï¼å¾®è½¯ååå ¼å®¹ * <li>7 ä¿çä¾ä»¥åå®ä¹ä½¿ç¨ * </ul> * * @return æ¤ {@code UUID} ç¸å ³èçåä½å· */ public int variant() { // This field is composed of a varying number of bits. // 0 - - Reserved for NCS backward compatibility // 1 0 - The IETF aka Leach-Salz variant (used by this class) // 1 1 0 Reserved, Microsoft backward compatibility // 1 1 1 Reserved for future definition. return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63)); } /** * 䏿¤ UUID ç¸å ³èçæ¶é´æ³å¼ã * * <p> * 60 ä½çæ¶é´æ³å¼æ ¹æ®æ¤ {@code UUID} ç time_lowãtime_mid å time_hi åæ®µæé ã<br> * æå¾å°çæ¶é´æ³ä»¥ 100 毫微ç§ä¸ºåä½ï¼ä» UTCï¼éç¨åè°æ¶é´ï¼ 1582 å¹´ 10 æ 15 æ¥é¶æ¶å¼å§ã * * <p> * æ¶é´æ³å¼ä» å¨å¨åºäºæ¶é´ç UUIDï¼å ¶ version ç±»å为 1ï¼ä¸æææä¹ã<br> * å¦ææ¤ {@code UUID} 䏿¯åºäºæ¶é´ç UUIDï¼åæ¤æ¹æ³æåº UnsupportedOperationExceptionã * * @throws UnsupportedOperationException å¦ææ¤ {@code UUID} 䏿¯ version 为 1 ç UUIDã */ public long timestamp() throws UnsupportedOperationException { checkTimeBase(); return (mostSigBits & 0x0FFFL) << 48// | ((mostSigBits >> 16) & 0x0FFFFL) << 32// | mostSigBits >>> 32; } /** * 䏿¤ UUID ç¸å ³èçæ¶éåºåå¼ã * * <p> * 14 ä½çæ¶éåºå弿 ¹æ®æ¤ UUID ç clock_seq åæ®µæé ãclock_seq åæ®µç¨äºä¿è¯å¨åºäºæ¶é´ç UUID ä¸çæ¶é´å¯ä¸æ§ã * <p> * {@code clockSequence} å¼ä» å¨åºäºæ¶é´ç UUIDï¼å ¶ version ç±»å为 1ï¼ä¸æææä¹ã å¦ææ¤ UUID 䏿¯åºäºæ¶é´ç UUIDï¼åæ¤æ¹æ³æåº * UnsupportedOperationExceptionã * * @return æ¤ {@code UUID} çæ¶éåºå * * @throws UnsupportedOperationException å¦ææ¤ UUID ç version ä¸ä¸º 1 */ public int clockSequence() throws UnsupportedOperationException { checkTimeBase(); return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48); } /** * 䏿¤ UUID ç¸å ³çèç¹å¼ã * * <p> * 48 ä½çèç¹å¼æ ¹æ®æ¤ UUID ç node åæ®µæé ãæ¤åæ®µæ¨å¨ç¨äºä¿åæºå¨ç IEEE 802 å°åï¼è¯¥å°åç¨äºçææ¤ UUID 以ä¿è¯ç©ºé´å¯ä¸æ§ã * <p> * èç¹å¼ä» å¨åºäºæ¶é´ç UUIDï¼å ¶ version ç±»å为 1ï¼ä¸æææä¹ã<br> * å¦ææ¤ UUID 䏿¯åºäºæ¶é´ç UUIDï¼åæ¤æ¹æ³æåº UnsupportedOperationExceptionã * * @return æ¤ {@code UUID} çèç¹å¼ * * @throws UnsupportedOperationException å¦ææ¤ UUID ç version ä¸ä¸º 1 */ public long node() throws UnsupportedOperationException { checkTimeBase(); return leastSigBits & 0x0000FFFFFFFFFFFFL; } /** * è¿åæ¤{@code UUID} çå符串表ç°å½¢å¼ã * * <p> * UUID çå符串表示形å¼ç±æ¤ BNF æè¿°ï¼ * * <pre> * {@code * UUID = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node> * time_low = 4*<hexOctet> * time_mid = 2*<hexOctet> * time_high_and_version = 2*<hexOctet> * variant_and_sequence = 2*<hexOctet> * node = 6*<hexOctet> * hexOctet = <hexDigit><hexDigit> * hexDigit = [0-9a-fA-F] * } * </pre> * * </blockquote> * * @return æ¤{@code UUID} çå符串表ç°å½¢å¼ * @see #toString(boolean) */ @Override public String toString() { return toString(false); } /** * è¿åæ¤{@code UUID} çå符串表ç°å½¢å¼ã * * <p> * UUID çå符串表示形å¼ç±æ¤ BNF æè¿°ï¼ * * <pre> * {@code * UUID = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node> * time_low = 4*<hexOctet> * time_mid = 2*<hexOctet> * time_high_and_version = 2*<hexOctet> * variant_and_sequence = 2*<hexOctet> * node = 6*<hexOctet> * hexOctet = <hexDigit><hexDigit> * hexDigit = [0-9a-fA-F] * } * </pre> * * </blockquote> * * @param isSimple æ¯å¦ç®å模å¼ï¼ç®å模å¼ä¸ºä¸å¸¦'-'çUUIDå符串 * @return æ¤{@code UUID} çå符串表ç°å½¢å¼ */ public String toString(boolean isSimple) { final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36); // time_low builder.append(digits(mostSigBits >> 32, 8)); if (!isSimple) { builder.append('-'); } // time_mid builder.append(digits(mostSigBits >> 16, 4)); if (!isSimple) { builder.append('-'); } // time_high_and_version builder.append(digits(mostSigBits, 4)); if (!isSimple) { builder.append('-'); } // variant_and_sequence builder.append(digits(leastSigBits >> 48, 4)); if (!isSimple) { builder.append('-'); } // node builder.append(digits(leastSigBits, 12)); return builder.toString(); } /** * è¿åæ¤ UUID çåå¸ç ã * * @return UUID çåå¸ç å¼ã */ @Override public int hashCode() { long hilo = mostSigBits ^ leastSigBits; return ((int) (hilo >> 32)) ^ (int) hilo; } /** * å°æ¤å¯¹è±¡ä¸æå®å¯¹è±¡æ¯è¾ã * <p> * å½ä¸ä» å½åæ°ä¸ä¸º {@code null}ãèæ¯ä¸ä¸ª UUID 对象ãå ·æä¸æ¤ UUID ç¸åç varriantãå å«ç¸åçå¼ï¼æ¯ä¸ä½åç¸åï¼æ¶ï¼ç»ææä¸º {@code true}ã * * @param obj è¦ä¸ä¹æ¯è¾ç对象 * * @return å¦æå¯¹è±¡ç¸åï¼åè¿å {@code true}ï¼å¦åè¿å {@code false} */ @Override public boolean equals(Object obj) { if ((null == obj) || (obj.getClass() != UUID.class)) { return false; } UUID id = (UUID) obj; return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits); } // Comparison Operations /** * å°æ¤ UUID 䏿å®ç UUID æ¯è¾ã * * <p> * å¦æä¸¤ä¸ª UUID ä¸åï¼ä¸ç¬¬ä¸ä¸ª UUID çæé«ææå段大äºç¬¬äºä¸ª UUID ç对åºå段ï¼å第ä¸ä¸ª UUID 大äºç¬¬äºä¸ª UUIDã * * @param val 䏿¤ UUID æ¯è¾ç UUID * * @return 卿¤ UUID å°äºãçäºæå¤§äº val æ¶ï¼åå«è¿å -1ã0 æ 1ã * */ @Override public int compareTo(UUID val) { // The ordering is intentionally set up so that the UUIDs // can simply be numerically compared as two numbers return (this.mostSigBits < val.mostSigBits ? -1 : // (this.mostSigBits > val.mostSigBits ? 1 : // (this.leastSigBits < val.leastSigBits ? -1 : // (this.leastSigBits > val.leastSigBits ? 1 : // 0)))); } // ------------------------------------------------------------------------------------------------------------------- // Private method start /** * è¿åæå®æ°å对åºçhexå¼ * * @param val å¼ * @param digits ä½ * @return å¼ */ private static String digits(long val, int digits) { long hi = 1L << (digits * 4); return Long.toHexString(hi | (val & (hi - 1))).substring(1); } /** * æ£æ¥æ¯å¦ä¸ºtime-basedçæ¬UUID */ private void checkTimeBase() { if (version() != 1) { throw new UnsupportedOperationException("Not a time-based UUID"); } } /** * è·å{@link SecureRandom}ï¼ç±»æä¾å å¯çå¼ºéæºæ°çæå¨ (RNG) * * @return {@link SecureRandom} */ public static SecureRandom getSecureRandom() { try { return SecureRandom.getInstance("SHA1PRNG"); } catch (NoSuchAlgorithmException e) { throw new UtilException(e); } } /** * è·åéæºæ°çæå¨å¯¹è±¡<br> * ThreadLocalRandomæ¯JDK 7ä¹åæä¾å¹¶å产çéæºæ°ï¼è½å¤è§£å³å¤ä¸ªçº¿ç¨åççç«äºäºå¤ºã * * @return {@link ThreadLocalRandom} */ public static ThreadLocalRandom getRandom() { return ThreadLocalRandom.current(); } }