12

我正在尝试将 JavaScript 散列函数转换为 C# 散列以执行完全相同的操作。我在那里 99%,但我遇到了这个自定义函数中使用的小数的障碍。
不知道为什么,但是这个函数出于某种奇怪的原因将散列值转换为小数,我的问题是生成的小数并不总是相同的长度。C# 中的小数点要长一些,但长度一致。我遇到的问题是因为 C# 中的舍入与 JavaScript 的工作方式不同,我不确切知道要舍入多少小数来创建等效长度的字符串。

这是两个生成的十进制字符串相互附加的示例。都从 4,4 和 3 个字符串开始:

4 char 字符串生成 79957.88183577501
4个字符字符串生成160933.02806113224
3 char 字符串生成 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()函数只返回每个字符的 ASCII int 代码。

除了小数的长度外,我让整个事情运行良好。

4

2 回答 2

5

如果您Number在 javascript 中使用,则double在 C# 中使用。两者都是 64 位 IEEE 754 数字(双精度)。您得到相同的值(验证后更新)。

于 2012-10-24T08:01:29.697 回答
2

我认为您的问题与双精度十进制数的 javascript 限制有关。这为您提供了大约 16 位的精度。您将需要考虑使用基于字符串的解决方法。可以在此处找到其他详细信息,包括解决方法如何在 Firefox/IE7 中处理大于 17 位的数字?

于 2012-10-24T04:28:16.647 回答