Javascript 相当于 Java 的 UUID 类

2024-01-06

在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

中引用了相同的示例另一个问题 https://stackoverflow.com/questions/66304547/javascript-typescript-convert-uuid-from-most-significant-bits-msb-least-signi这是非常相似的,所以这将是一个后续。虽然在 lsb, msb -> string 的相关问题中得到了解决,但我找不到反向问题的解决方案,string -> msb, lsb

原来的解决方案是

function toUuidString(lsb, msb) {
    return `${digits(msb >> 32n, 8n)}-${digits(msb >> 16n, 4n)}-${digits(
        msb,
        4n
    )}-${digits(lsb >> 48n, 4n)}-${digits(lsb, 12n)}`
}

function digits(value, ds) {
    const hi = 1n << (ds * 4n)

    return (hi | (value & (hi - 1n))).toString(16).slice(1)
}

现在我想要一个接受字符串并返回 msb 和 lsb 的函数。 沿着原始问题的路径,我发现java源代码 http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/default/src/share/classes/java/util/UUID.java并尝试做等效的事情,即:

function fromString(name) {
    let components = name.split('-')

    if (components.length !== 5) {
        throw new Error(`Invalid UUID string: ${name}`)
    }

    for (let index = 0; index < 5; index++) {
        components[index] = `0x${components[index]}`
    }

    let mostSigBits = Number.parseInt(components[0], 16)
    mostSigBits <<= 16
    mostSigBits |= Number.parseInt(components[1], 16)
    mostSigBits <<= 16
    mostSigBits |= Number.parseInt(components[2], 16)

    let leastSigBits = Number.parseInt(components[3], 16)
    leastSigBits <<= 48
    leastSigBits |= Number.parseInt(components[4], 16)

    return {
        leastSigBits,
        mostSigBits,
    }
}

然而,当我尝试用类似的东西来测试它时:

const originalUuid = 'eb66c416-4739-465b-9af3-9dc33ed8eef9'
const parts = fromString(originalUuid)

const newUUid = toUuidString(
    BigInt(parts.leastSigBits),
    BigInt(parts.mostSigBits)
)

console.log('Original', originalUuid)
console.log('New', newUUid)

我没有得到等效的 uuid。它们具有相同的部件,但缺少一些部件

Original eb66c416-4739-465b-9af3-9dc33ed8eef9
New 00000000-4739-465b-ffff-ffffbefbeef9

有什么想法出了什么问题吗?


最后我发现了问题——两段代码并不是严格等价的,java源代码声明mostSigBits和leastSigBits一样长,无法用javascript表示,所以我们需要使用BigInt。

总结一下我的问题和之前的问题,java UUID 操作的 javascript 等效项是:

字符串 -> 最高有效位、最低有效位

function fromString(name) {
    let components = name.split('-')

    if (components.length !== 5) {
        throw new Error(`Invalid UUID string: ${name}`)
    }

    for (let index = 0; index < 5; index++) {
        components[index] = `0x${components[index]}`
    }

    let mostSigBits = BigInt(Number.parseInt(components[0], 16))
    mostSigBits <<= 16n
    mostSigBits |= BigInt(Number.parseInt(components[1], 16))
    mostSigBits <<= 16n
    mostSigBits |= BigInt(Number.parseInt(components[2], 16))

    let leastSigBits = BigInt(Number.parseInt(components[3], 16))
    leastSigBits <<= 48n
    leastSigBits |= BigInt(Number.parseInt(components[4], 16))

    return {
        leastSigBits,
        mostSigBits,
    }
}

msb、lsb -> 字符串(来自引用的问题)

function toUuidString(lsb, msb) {
    return `${digits(msb >> 32n, 8n)}-${digits(msb >> 16n, 4n)}-${digits(
        msb,
        4n
    )}-${digits(lsb >> 48n, 4n)}-${digits(lsb, 12n)}`
}

function digits(value, ds) {
    const hi = 1n << (ds * 4n)

    return (hi | (value & (hi - 1n))).toString(16).slice(1)
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 相当于 Java 的 UUID 类 的相关文章

  • 如何在 Yarn 中使用多个 npm 注册表?

    我正在尝试在我们的环境中设置 Yarn 0 17 9 但我的注册表有问题 我们目前使用两个注册中心 官方 npmjs 和我们自己的内部网络注册中心 Sinopia 问题是我们正在使用内部工具通过 registry 标志从一个或另一个中提取软
  • 如何在 React JS 中根据键创建动态表?

    我正在尝试在 React JS 中创建一个动态表组件 该组件当前只有一个静态标头 其中包括最常见的结果键 有些结果还包含更多信息 例如电话号码 学位 如何根据键 值的存在动态地使用附加列扩展表 我应该与state并在存在时使其可见 或者我应
  • 如何在 Lambda 中将对象上传到 S3?

    似乎无法将对象上传到 Lambda 中的 S3 本地一切正常 日志中没有错误可以显示出了什么问题 代码如下 console log Loading function var AWS require aws sdk var s3 new AW
  • 多次训练brain.js?

    在第一次训练后 如何将新信息 仅新信息 而不是所有信息 因为这会花费太多性能 训练到我的用 Brain js 制作的神经网络 它有点粗糙 但您可以使用以下结构来实现 如果我们加入 2 个训练数据集 旧数据集与新数据集 然后重新训练keepN
  • 将 SVG 路径转换为绝对命令

    给定一个 SVG Path 元素 如何将所有路径命令转换为绝对坐标 例如 转换此路径
  • html 图像 src 调用 javaScript 变量

    这是我的代码 我想问 我怎样才能做到这一点 img src img apple 我一直在尝试使用 call 函数和 document onload 但它根本不起作用 有人可以救我吗 我假设你只是想用 javascript 更新图像 src
  • 有没有办法在 React 中自动播放音频而不使用 onClick 事件?

    我在尝试在 componentDidMount 中播放音频时收到此错误 未捕获 承诺中 DOMException play 失败 因为用户没有先与文档交互 componentDidMount document getElementById
  • Twitter Bootstrap - 下拉菜单 - 箭头键不适用于 Firefox 中的输入标签

    要求 我想在带有用户名和密码字段的下拉菜单中放置一个登录表单 我可以做到这一点 除了以下问题之外 一切正常 Issue 打字时我无法使用箭头键 上 下 firefox 当输入位于下拉代码之外时 这很有效 这适用于其他浏览器 例如 googl
  • 为动态加载的 HTML 内容触发 Bootstrap JS 行为

    我正在动态加载包含 Bootstrap 标记的 HTML 模板 但是 Bootstrap Javascript 行为不会应用于加载的内容 例如 如果加载的内容包含 Bootstrap 模式的标记 则该模式将无法正确运行 有没有办法可以触发
  • 个人 Tumblr 帖子上的 Javascript

    我知道您可以编辑在 tumblr 博客上呈现所有帖子博客主页的 html AngularJS 但是 有什么办法可以添加自定义到各个帖子 我想在逐个帖子的基础上做一些 javascript 的东西 但似乎无法找到可以编辑代码的位置 或者 如果
  • 如何用 JavaScript 修复图像透视变形和旋转?

    我有一些用手机拍摄的图像 有没有可以拉直纸张照片并将其压平的 JavaScript 库 例如 我想创建一个矩形图像 该图像没有任何失真 换句话说我想知道如何用 JavaScript 修复透视变形和旋转 例如 我发现下面的示例图像来自this
  • 将文本字段限制为仅包含数字的最佳方法?

    I m using the following Javascript to restrict a text field on my website to only accept numerical input and no other le
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • 检查浏览器空闲的替代方法

    我有一个简单的网络信息亭 在鼠标未使用 jQuery 移动 30 秒后显示用户操作提示 var i null body wrap mousemove function clearTimeout i overlay fadeOut i set
  • 如何使用 Javascript 在 html 文件中搜索字符串?

    我有 5 个 html 文件 并且有一个搜索表单 我想用它来搜索这些 html 文件中的文本
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 什么时候可以使用Javascript,什么时候不可以?

    不使用太多 javascript jquery 是个好习惯吗 我们应该尽可能避免它 为了良好的可访问性 吗 什么时候可以使用 JavaScript 什么时候不能在网页设计和开发中使用 JavaScript 在什么场景 什么条件下 Updat
  • 根据文本内容从 jquery 对象中过滤元素

    我正在尝试使用contains带有 this 关键字 但它给出了错误 JS function var check ul find li filter function return this contains two css color r
  • 如何将数据推送到嵌套对象

    如何将另一个元素推入variables来自以下对象的属性 var request name Name id 3 rules name Rule name tags tagId 1 variables variable var1 matchT
  • VS Code 扩展 - 获取完整路径

    我正在为 VS Code 编写一个插件 我需要知道调用扩展的文件的路径 无论是从编辑器上下文菜单或资源管理器上下文菜单调用还是用户只需键入扩展命令 function activate context get full path of the

随机推荐