Skip to content

Commit 87a004e

Browse files
committed
更新 UUID 文档内容
1 parent 7efaee8 commit 87a004e

6 files changed

Lines changed: 194 additions & 0 deletions

File tree

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
2+
# Root logger
3+
log4j.rootLogger=INFO, file, stdout
4+
5+
# Write to console
6+
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
7+
log4j.appender.stdout.Target=System.out
8+
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
9+
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<configuration>
3+
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
4+
<encoder>
5+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
6+
</pattern>
7+
</encoder>
8+
</appender>
9+
10+
<logger name="org.springframework" level="WARN" />
11+
<logger name="org.springframework.transaction" level="WARN" />
12+
13+
<!-- in order to debug some marshalling issues, this needs to be TRACE -->
14+
<logger name="org.springframework.web.servlet.mvc" level="WARN" />
15+
16+
<root level="INFO">
17+
<appender-ref ref="STDOUT" />
18+
</root>
19+
</configuration>
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.ossez.uuid;
2+
3+
import static org.apache.commons.codec.binary.Base64.decodeBase64;
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
5+
6+
import java.nio.ByteBuffer;
7+
import java.util.Base64;
8+
import java.util.UUID;
9+
10+
import org.apache.commons.lang3.Conversion;
11+
import org.junit.jupiter.api.Test;
12+
13+
public class DecodeUUIDStringFromBase64UnitTest {
14+
private final UUID originalUUID = UUID.fromString("cc5f93f7-8cf1-4a51-83c6-e740313a0c6c");
15+
16+
@Test
17+
public void givenEncodedString_whenDecodingUsingBase64Decoder_thenGiveExpectedUUID() {
18+
String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw";
19+
byte[] decodedBytes = Base64.getDecoder()
20+
.decode(expectedEncodedString);
21+
UUID uuid = convertToUUID(decodedBytes);
22+
assertEquals(originalUUID, uuid);
23+
}
24+
25+
@Test
26+
public void givenEncodedString_whenDecodingUsingByteBufferAndBase64UrlDecoder_thenGiveExpectedUUID() {
27+
String expectedEncodedString = "zF-T94zxSlGDxudAMToMbA";
28+
byte[] decodedBytes = Base64.getUrlDecoder()
29+
.decode(expectedEncodedString);
30+
ByteBuffer byteBuffer = ByteBuffer.wrap(decodedBytes);
31+
long mostSignificantBits = byteBuffer.getLong();
32+
long leastSignificantBits = byteBuffer.getLong();
33+
UUID uuid = new UUID(mostSignificantBits, leastSignificantBits);
34+
assertEquals(originalUUID, uuid);
35+
}
36+
37+
@Test
38+
public void givenEncodedString_whenDecodingUsingApacheUtils_thenGiveExpectedUUID() {
39+
String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw";
40+
byte[] decodedBytes = decodeBase64(expectedEncodedString);
41+
UUID uuid = Conversion.byteArrayToUuid(decodedBytes, 0);
42+
assertEquals(originalUUID, uuid);
43+
}
44+
45+
private UUID convertToUUID(byte[] src) {
46+
long mostSignificantBits = convertBytesToLong(src, 0);
47+
long leastSignificantBits = convertBytesToLong(src, 8);
48+
49+
return new UUID(mostSignificantBits, leastSignificantBits);
50+
}
51+
52+
private long convertBytesToLong(byte[] uuidBytes, int start) {
53+
long result = 0;
54+
55+
for(int i = 0; i < 8; i++) {
56+
int shift = i * 8;
57+
long bits = (255L & (long)uuidBytes[i + start]) << shift;
58+
long mask = 255L << shift;
59+
result = result & ~mask | bits;
60+
}
61+
62+
return result;
63+
}
64+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.ossez.uuid;
2+
3+
import static org.apache.commons.codec.binary.Base64.encodeBase64URLSafeString;
4+
import static org.junit.jupiter.api.Assertions.assertEquals;
5+
6+
import java.nio.ByteBuffer;
7+
import java.util.Base64;
8+
import java.util.UUID;
9+
10+
import org.apache.commons.lang3.Conversion;
11+
import org.junit.jupiter.api.Test;
12+
13+
public class EncodeUUIDToBase64StringUnitTest {
14+
private final UUID originalUUID = UUID.fromString("cc5f93f7-8cf1-4a51-83c6-e740313a0c6c");
15+
16+
@Test
17+
public void givenUUID_whenEncodingUsingBase64Encoder_thenGiveExpectedEncodedString() {
18+
String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw";
19+
byte[] uuidBytes = convertToByteArray(originalUUID);
20+
String encodedUUID = Base64.getEncoder().withoutPadding()
21+
.encodeToString(uuidBytes);
22+
assertEquals(expectedEncodedString, encodedUUID);
23+
}
24+
25+
@Test
26+
public void givenUUID_whenEncodingUsingByteBufferAndBase64UrlEncoder_thenGiveExpectedEncodedString() {
27+
String expectedEncodedString = "zF-T94zxSlGDxudAMToMbA";
28+
ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]);
29+
byteBuffer.putLong(originalUUID.getMostSignificantBits());
30+
byteBuffer.putLong(originalUUID.getLeastSignificantBits());
31+
String encodedUUID = Base64.getUrlEncoder().withoutPadding()
32+
.encodeToString(byteBuffer.array());
33+
assertEquals(expectedEncodedString, encodedUUID);
34+
}
35+
36+
@Test
37+
public void givenUUID_whenEncodingUsingApacheUtils_thenGiveExpectedEncodedString() {
38+
String expectedEncodedString = "UUrxjPeTX8xsDDoxQOfGgw";
39+
byte[] bytes = Conversion.uuidToByteArray(originalUUID, new byte[16], 0, 16);
40+
String encodedUUID = encodeBase64URLSafeString(bytes);
41+
assertEquals(expectedEncodedString, encodedUUID);
42+
}
43+
44+
private byte[] convertToByteArray(UUID uuid) {
45+
byte[] result = new byte[16];
46+
47+
long mostSignificantBits = uuid.getMostSignificantBits();
48+
fillByteArray(0, 8, result, mostSignificantBits);
49+
50+
long leastSignificantBits = uuid.getLeastSignificantBits();
51+
fillByteArray(8, 16, result, leastSignificantBits);
52+
53+
return result;
54+
}
55+
56+
private static void fillByteArray(int start, int end, byte[] result, long bits) {
57+
for (int i = start; i < end; i++) {
58+
int shift = i * 8;
59+
result[i] = (byte) ((int) (255L & bits >> shift));
60+
}
61+
}
62+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.ossez.uuid;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.util.UUID;
6+
7+
import static org.assertj.core.api.Assertions.assertThat;
8+
9+
public class UUIDPositiveLongGeneratorUnitTest {
10+
11+
@Test
12+
public void whenGetMostSignificantBits_thenAssertPositive() {
13+
long randomPositiveLong = Math.abs(UUID.randomUUID().getMostSignificantBits());
14+
assertThat(randomPositiveLong).isNotNegative();
15+
}
16+
17+
@Test
18+
public void whenGetLeastSignificantBits_thenAssertPositive() {
19+
long randomPositiveLong = Math.abs(UUID.randomUUID().getLeastSignificantBits());
20+
assertThat(randomPositiveLong).isNotNegative();
21+
}
22+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<configuration>
3+
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
4+
<encoder>
5+
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
6+
</encoder>
7+
</appender>
8+
9+
<logger name="org.springframework" level="WARN" />
10+
<logger name="org.springframework.transaction" level="WARN" />
11+
12+
<!-- in order to debug some marshalling issues, this needs to be TRACE -->
13+
<logger name="org.springframework.web.servlet.mvc" level="WARN" />
14+
15+
<root level="INFO">
16+
<appender-ref ref="STDOUT" />
17+
</root>
18+
</configuration>

0 commit comments

Comments
 (0)