是否可以使用 JMeter 生成 UUID v1?
Is it possible to generate UUID v1 with JMeter?
我看了JMeter的手册,看到JMeter有__uuid()函数。它允许为 JMeter 测试生成 UUID 类型 4。是否可以在 JMeter 中生成 UUIDv1 或者是否存在某些插件。
在 jmeter 中,您可以添加 JSR 223 Sampler 选择 Java 语言并为 UUID 版本 1 执行 java 代码:
String timeuuid = com.datastax.driver.core.utils.UUIDs.timeBased().toString();
然后添加到Jmeter变量中:
vars.put("myUUID", timeuuid);
我建议采取以下步骤:
- 下载Jug library (for example from here) and drop the .jar somewhere to JMeter Classpath
- 重新启动 JMeter 以拾取 .jar
完成后,您应该能够使用 JSR223 Test Elements and Groovy language 生成 UUIDv1,例如:
import com.fasterxml.uuid.EthernetAddress
import com.fasterxml.uuid.Generators
import com.fasterxml.uuid.impl.TimeBasedGenerator
def addr = EthernetAddress.fromInterface()
def gen = Generators.timeBasedGenerator(addr)
def v1uuid = gen.generate()
log.info(v1uuid.toString())
演示:
参考文献:
首先,我们将生成 64 个最低和最高有效位作为 long 值:
private static long get64LeastSignificantBitsForVersion1() {
Random random = new Random();
long random63BitLong = random.nextLong() & 0x3FFFFFFFFFFFFFFFL;
long variant3BitFlag = 0x8000000000000000L;
return random63BitLong + variant3BitFlag;
}
private static long get64MostSignificantBitsForVersion1() {
LocalDateTime start = LocalDateTime.of(1582, 10, 15, 0, 0, 0);
Duration duration = Duration.between(start, LocalDateTime.now());
long seconds = duration.getSeconds();
long nanos = duration.getNano();
long timeForUuidIn100Nanos = seconds * 10000000 + nanos * 100;
long least12SignificatBitOfTime = (timeForUuidIn100Nanos & 0x000000000000FFFFL) >> 4;
long version = 1 << 12;
return
(timeForUuidIn100Nanos & 0xFFFFFFFFFFFF0000L) + version + least12SignificatBitOfTime;
}
然后我们可以将这两个值传递给 UUID 的构造函数:
public static UUID generateType1UUID() {
long most64SigBits = get64MostSignificantBitsForVersion1();
long least64SigBits = get64LeastSignificantBitsForVersion1();
return new UUID(most64SigBits, least64SigBits);
}
我看了JMeter的手册,看到JMeter有__uuid()函数。它允许为 JMeter 测试生成 UUID 类型 4。是否可以在 JMeter 中生成 UUIDv1 或者是否存在某些插件。
在 jmeter 中,您可以添加 JSR 223 Sampler 选择 Java 语言并为 UUID 版本 1 执行 java 代码:
String timeuuid = com.datastax.driver.core.utils.UUIDs.timeBased().toString();
然后添加到Jmeter变量中:
vars.put("myUUID", timeuuid);
我建议采取以下步骤:
- 下载Jug library (for example from here) and drop the .jar somewhere to JMeter Classpath
- 重新启动 JMeter 以拾取 .jar
完成后,您应该能够使用 JSR223 Test Elements and Groovy language 生成 UUIDv1,例如:
import com.fasterxml.uuid.EthernetAddress import com.fasterxml.uuid.Generators import com.fasterxml.uuid.impl.TimeBasedGenerator def addr = EthernetAddress.fromInterface() def gen = Generators.timeBasedGenerator(addr) def v1uuid = gen.generate() log.info(v1uuid.toString())
演示:
参考文献:
首先,我们将生成 64 个最低和最高有效位作为 long 值:
private static long get64LeastSignificantBitsForVersion1() {
Random random = new Random();
long random63BitLong = random.nextLong() & 0x3FFFFFFFFFFFFFFFL;
long variant3BitFlag = 0x8000000000000000L;
return random63BitLong + variant3BitFlag;
}
private static long get64MostSignificantBitsForVersion1() {
LocalDateTime start = LocalDateTime.of(1582, 10, 15, 0, 0, 0);
Duration duration = Duration.between(start, LocalDateTime.now());
long seconds = duration.getSeconds();
long nanos = duration.getNano();
long timeForUuidIn100Nanos = seconds * 10000000 + nanos * 100;
long least12SignificatBitOfTime = (timeForUuidIn100Nanos & 0x000000000000FFFFL) >> 4;
long version = 1 << 12;
return
(timeForUuidIn100Nanos & 0xFFFFFFFFFFFF0000L) + version + least12SignificatBitOfTime;
}
然后我们可以将这两个值传递给 UUID 的构造函数:
public static UUID generateType1UUID() {
long most64SigBits = get64MostSignificantBitsForVersion1();
long least64SigBits = get64LeastSignificantBitsForVersion1();
return new UUID(most64SigBits, least64SigBits);
}