12

JavaScriptハッシュ関数をC#ハッシュに変換して、まったく同じことを実行しようとしています。私は99%そこにいますが、このカスタム関数で使用される小数で問題が発生しました。
理由はわかりませんが、この関数は奇妙な理由でハッシュ値を小数に変換します。私の問題は、生成される小数が常に同じ長さであるとは限らないことです。C#の小数はかなり長くなりますが、長さは均一です。私が抱えている問題は、C#での丸めがJavaScriptとは異なる動作をするため、同等の長さの文字列を作成するためにどの小数点で丸めるかが正確にわからないためです。

これは、互いに追加される2つの生成された10進文字列の例です。どちらも4、4、および3文字の文字列から始まります。

4文字の文字列は79957.88183577501を生成します
4文字の文字列は160933.02806113224を生成します
3文字の文字列は609.9111294990053を生成します

まったく同じコードを使用するC#は、まったく同じ入力を使用して生成します。

79957.88183577500452161331162
160933.02806113221197323204919
609.91112949900524507144149035

すべての文字列が同じ長さであれば問題ありませんが、JSがより長い小数をいつ生成するかを決定する方法がわかりません。手がかりはありますか?コメント?意見?

残念ながら、受信コードはまだ元のJSであり、プロセスを逆にするだけなので、すべての入力に対して最終結果を完全に複製する必要があります。

編集:

ここに問題のあるセクションがあります。なぜそれがそのように機能するのか私に聞かないでください、私はそれを書きませんでした。

// 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()関数は、各文字のASCIIintコードを返すだけです。

小数の長さを除いて、すべてがうまく機能しました。

4

2 に答える 2

5

Numberjavascriptで使用している場合はdouble、C#で使用してください。どちらも64ビットIEEE754番号(倍精度)です。同じ値を取得します(これを確認した後に更新されます)。

于 2012-10-24T08:01:29.697 に答える
2

あなたの問題は、倍精度10進数のJavaScriptの制限に関連していると思います。これにより、約16桁の精度が得られます。文字列に基づく回避策の使用を検討する必要があります。回避策などの詳細については、こちらをご覧ください。Firefox/ IE7で17桁を超える数字を処理するにはどうすればよいですか?

于 2012-10-24T04:28:16.647 に答える