好的,我终于自己设计和生产了。
我生成一个COMB_GUID,其中高32位基于Unix时间的33至1位(以毫秒为单位)。因此,每2毫秒存在93位随机性,并且每106年发生一次高位翻转。COMB_GUID(或类型4 UUID)的实际物理表示形式是128位的base64编码版本,它是22个字符的字符串。
当在postgres中插入时,完全随机UUID和COMB _GUID之间的速度比对COMB_GUID有利。在100万条记录的测试中,通过多项测试,COMB_GUID在我的硬件上的速度提高了2倍。记录包含id(22个字符),字符串字段(110个字符),双精度和INT。
在ElasticSearch中,两者之间没有明显的区别以进行索引。作为内容被送入时间有关,或可在id字段被预先排序,以便它我仍然会在内容的情况下使用COMB_GUIDS去BTREE索引链中的任何地方IS时间有关,部分连续的,它会加快。
非常有趣。下面是制作COMB_GUID的Java代码。
import java.util.Arrays;
import java.util.UUID;
import java.util.Base64; //Only avail in Java 8+
import java.util.Date;
import java.nio.ByteBuffer;
private ByteBuffer babuffer = ByteBuffer.allocate( (Long.SIZE/8)*2 );
private Base64.Encoder encoder = Base64.getUrlEncoder();
public String createId() {
UUID uuid = java.util.UUID.randomUUID();
return uuid2base64( uuid );
}
public String uuid2base64(UUID uuid){
Date date= new Date();
int intFor32bits;
synchronized(this){
babuffer.putLong(0,uuid.getLeastSignificantBits() );
babuffer.putLong(8,uuid.getMostSignificantBits() );
long time=date.getTime();
time=time >> 1; // makes it every 2 milliseconds
intFor32bits = (int) time; // rolls over every 106 yers + 1 month from epoch
babuffer.putInt( 0, intFor32bits);
}
//does this cause a memory leak?
return encoder.encodeToString( babuffer.array() );
}
}