MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

JavaScript:convertire un numero esadecimale di 24 cifre in decimale, aggiungere 1 e quindi riconvertire?

Questa versione restituirà una stringa lunga quanto la stringa di input, quindi l'overflow viene ignorato nel caso in cui l'input sia qualcosa come "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"));

Questa versione può restituire una stringa più lunga di 1 carattere rispetto alla stringa di input, perché input come "ffffffff" vengono trasferiti per diventare "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"));

Ero curioso di vedere se il suggerimento di user2864740 di lavorare con blocchi a 12 cifre offrisse qualche vantaggio. Con mia sorpresa, anche se il codice sembra più complicato, in realtà è circa due volte più veloce. Ma anche la prima versione viene eseguita 500.000 volte al secondo, quindi non te ne accorgerai nel mondo reale.

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"));