[英]JavaScript/TypeScript: Convert UUID from most significant bits (MSB)/least significant bits (LSB) representation to string
為了在使用協議緩沖區傳遞 UUID 時節省空間,我們使用 MSB/LSB 表示形式發送它們,兩個 64 位long
值。
message Uuid {
sfixed64 msb = 1;
sfixed64 lsb = 2;
}
這些是簡單的 go 往返於 Java,
UUID id = UUID.fromString("eb66c416-4739-465b-9af3-9dc33ed8eef9");
long msb = id.getMostSignificantBits();
long lsb = id.getLeastSignificantBits();
System.out.println(msb + ", " + lsb);
// -1484283427208739237, -7281302710629372167
System.out.println(new UUID(msb, lsb));
// eb66c416-4739-465b-9af3-9dc33ed8eef9
但是,由於 JavaScript 的number
只上升到 2 53 - 1,我無法在我的 TypeScript 客戶端中將 MSB/LSB 格式轉換回string
。 這可能嗎?
查看 Java UUID
的toString()
方法以獲取靈感,
public String toString() {
return (digits(mostSigBits >> 32, 8) + "-" +
digits(mostSigBits >> 16, 4) + "-" +
digits(mostSigBits, 4) + "-" +
digits(leastSigBits >> 48, 4) + "-" +
digits(leastSigBits, 12));
}
private static String digits(long val, int digits) {
long hi = 1L << (digits * 4);
return Long.toHexString(hi | (val & (hi - 1))).substring(1);
}
我們可以使用BigInt
來做同樣的事情。 這假設 Node 10.8+(用 14.15.5 測試),TypeScript 面向 ES2020+,並且具有此瀏覽器兼容性。
注意:如果你得到“BigInt literals are not available...”用BigInt
包裝所有以n
結尾的文字(例如,使用BigInt(32)
代替32n
)。
export function toUuidString(lsb: bigint, msb: bigint): string {
return `${digits(msb >> 32n, 8n)}-${digits(msb >> 16n, 4n)}-${digits(
msb,
4n
)}-${digits(lsb >> 48n, 4n)}-${digits(lsb, 12n)}`;
}
function digits(val: bigint, ds: bigint): string {
const hi = 1n << (ds * 4n);
return (hi | (val & (hi - 1n))).toString(16).substring(1);
}
還有一個示例測試,注意 msb/lsb 作為string
s 傳遞給BigInt
,
it('converts UUID from msb/lsb to string', () => {
expect(
toUuidString(
BigInt('-1160168401362026442'),
BigInt('-6694969989912915968')
)
).toEqual('a316b044-0157-1000-efe6-40fc5d2f0036');
});
最后一塊是協議緩沖區。 默認情況下, google-protobuf
將number
用於 64 位float
和int
值,這會導致Number.MAX_VALUE
或 2 53 - 1 以上溢出。為避免這種情況,請在 64 位字段上使用jstype
注釋,
message Uuid {
sfixed64 msb = 1 [jstype = JS_STRING];
sfixed64 lsb = 2 [jstype = JS_STRING];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.