gpt4 book ai didi

JavaScript - 将 24 位十六进制数转换为十进制数,加 1,然后再转换回来?

转载 作者:可可西里 更新时间:2023-11-01 09:57:02 25 4
gpt4 key购买 nike

对于 MongoDB 中的 ObjectId,我使用 24 位十六进制数。因为我需要跟踪第二个集合,所以我需要将这个十六进制数加 1。

就我而言,这是我的值(value)

var value = "55a98f19b27585d81922ba0b"

我要找的是

var newValue = "55a98f19b25785d81922ba0c"

我试图为此创建一个函数

function hexPlusOne(hex) {
var num = (("0x" + hex) / 1) + 1;
return num.toString(16);
}

这适用于较小的十六进制数

hexPlusOne("eeefab")
=> "eeefac"

但是对于我的散列来说它惨遭失败

hexPlusOne(value)
=> "55a98f19b275840000000000"

有没有更好的办法解决这个问题?

最佳答案

此版本将返回与输入字符串一样长的字符串,因此如果输入类似于“ffffffff”,则忽略溢出。

function hexIncrement(str) {
var hex = str.match(/[0-9a-f]/gi);
var digit = hex.length;
var carry = 1;

while (digit-- && carry) {
var dec = parseInt(hex[digit], 16) + carry;
carry = Math.floor(dec / 16);
dec %= 16;
hex[digit] = dec.toString(16);
}
return(hex.join(""));
}

document.write(hexIncrement("55a98f19b27585d81922ba0b") + "<BR>");
document.write(hexIncrement("ffffffffffffffffffffffff"));

此版本可能会返回比输入字符串长 1 个字符的字符串,因为像“ffffffff”这样的输入会变成“100000000”。

function hexIncrement(str) {
var hex = str.match(/[0-9a-f]/gi);
var digit = hex.length;
var carry = 1;

while (digit-- && carry) {
var dec = parseInt(hex[digit], 16) + carry;
carry = Math.floor(dec / 16);
dec %= 16;
hex[digit] = dec.toString(16);
}
if (carry) hex.unshift("1");
return(hex.join(""));
}

document.write(hexIncrement("55a98f19b27585d81922ba0b") + "<BR>");
document.write(hexIncrement("ffffffffffffffffffffffff"));

我很好奇,想看看 user2864740 关于使用 12 位数字 block 的建议是否有任何优势。令我惊讶的是,尽管代码看起来更复杂,但实际上速度是原来的两倍左右。但第一个版本每秒也运行 500,000 次,因此您在现实世界中不会注意到。

function hexIncrement(str) {
var result = "";
var carry = 1;
while (str.length && carry) {
var hex = str.slice(-12);
if (/^f*$/i.test(hex)) {
result = hex.replace(/f/gi, "0") + result;
carry = 1;
} else {
result = ("00000000000" + (parseInt(hex, 16) + carry).toString(16)).slice(-hex.length) + result;
carry = 0;
}
str = str.slice(0,-12);
}
return(str.toLowerCase() + (carry ? "1" : "") + result);
}

document.write(hexIncrement("55a98f19b27585d81922ba0b") + "<BR>");
document.write(hexIncrement("000000000000ffffffffffff") + "<BR>");
document.write(hexIncrement("0123456789abcdef000000000000ffffffffffff"));

关于JavaScript - 将 24 位十六进制数转换为十进制数,加 1,然后再转换回来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31486470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com