我正在尝试将 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 代码。
除了小数的长度外,我让整个事情运行良好。