Phiên bản này sẽ trả về một chuỗi dài như chuỗi đầu vào, do đó, phần tràn sẽ bị bỏ qua trong trường hợp đầu vào giống như "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"));
Phiên bản này có thể trả về một chuỗi dài hơn 1 ký tự so với chuỗi đầu vào, bởi vì đầu vào như "ffffffff" sẽ chuyển thành "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"));
Tôi tò mò xem liệu gợi ý của user2864740 về việc làm việc với các khối 12 chữ số có mang lại lợi ích gì không. Tôi ngạc nhiên, mặc dù mã trông phức tạp hơn, nhưng nó thực sự nhanh gấp đôi. Nhưng phiên bản đầu tiên cũng chạy 500.000 lần mỗi giây, vì vậy nó không giống như bạn sẽ nhận thấy trong thế giới thực.
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"));