Подтвердить что ты не робот

Десятичные знаки, javascript vs С#

Я пытаюсь преобразовать функцию хеширования JavaScript в хеширование С#, чтобы сделать то же самое. Я нахожусь на 99%, но я попал в зацепку с десятичными знаками, используемыми в этой пользовательской функции.
Не знаю, почему, но эта функция преобразует хэшированное значение в десятичное число по какой-то нечетной причине, и моя проблема в том, что генерируемые десятичные знаки не всегда одинаковой длины. Десятичные числа в С# довольно длинны, но имеют равномерную длину. Проблема, с которой я сталкиваюсь, заключается в том, что округление в С# работает по-другому, чем JavaScript. Я не знаю точно, в какой десятичной форме округлить, чтобы создать эквивалентную длину.

Вот пример двух сгенерированных десятичных строк, которые добавляются друг к другу. Оба начинаются с 4,4 и 3 символьных строк:

4 char string generates 79957.88183577501
4 char string generates 160933.02806113224
3 char string generates 609.9111294990053

Используя тот же самый код, С# генерирует, используя те же самые входы:

79957.88183577500452161331162
160933.02806113221197323204919
609.91112949900524507144149035

Если все строки имеют одинаковую длину, это не будет проблемой, но я не знаю, как определить, когда JS будет генерировать более длинную десятичную. Любые подсказки? Комментарии? Мнения?

К сожалению, принимающий код по-прежнему является исходным JS, который просто меняет процесс, поэтому я должен полностью дублировать конечный результат для всех входов.

EDIT:

Вот проблематичный раздел. Не спрашивайте меня, почему это так, я не писал.

// oString is a full string to be encoded
// oKey is a key to be used for encoding
function completeHash(oString,oKey) {
    if( oKey.length < 5 ) {
        window.alert( 'The key must be at least 5 characters long' );
        return oString;
    }
    var oKeyNum = new Array(), oOutStr = '', oOp = new Array('+=','/=','-=','*= 0.01 *');
    for (var x = 0; x < oKey.length; x++) {
        oKeyNum[x] = parseInt('0x' + completeEscape(oKey.charAt(x)));
    }

    for( var x = 0, y = ''; x < oString.length; x += Math.round( oKey.length / 2 ), y = 'O.O' ) {
        var theNum = parseInt( '0x' + completeEscape( oString.substr( x, Math.round( oKey.length / 2 ) ) ) );

        // next two lines are problematic with decimals not having equal length
        for( var z = 0; z < oKey.length; z++ ) {
            eval( 'theNum ' + oOp[z % 4] + ' ' + oKeyNum[z] + ';' );
            alert('theNum:' + theNum);
        }

        oOutStr += y + theNum;
    }
    return oOutStr;
}
Функция

completeEscape() просто возвращает кодовые коды ASCII для каждого символа.

Я получил все, что прекрасно работало, кроме длины десятичных знаков.

4b9b3361

Ответ 1

Если вы используете Number в javascript, используйте double в С#. Оба являются 64-битными номерами IEEE 754 (с двойной точностью). Вы получаете те же значения (обновленные после проверки этого).

Ответ 2

Я думаю, ваша проблема связана с ограничением javascript для десятичных чисел с двойной точностью. Это дает вам около 16 цифр точности. Вам нужно будет рассмотреть возможность использования работы на основе строк. Дополнительные сведения, в том числе о работе, можно найти здесь Как я могу обрабатывать номера размером более 17 цифр в Firefox/IE7?