我正在尝试将一个JavaScript哈希函数转换为C#哈希函数以实现完全相同的功能。我已经完成了99%的工作,但是在这个自定义函数中使用的小数让我遇到了麻烦。
我不确定为什么,但是该函数出于某种奇怪的原因将哈希值转换为小数,我的问题是生成的小数不总是相同的长度。 C# 中的小数要长得多,但长度是一致的。 我的问题是由于C#中的四舍五入与JavaScript不同,我不知道应该在哪个小数位上进行四舍五入才能创建等效长度的字符串。
以下是两个生成的小数字符串的示例,它们被连接在一起。 它们都从 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()
函数仅返回每个字符的ASCII int代码。
我已经把整件事情做得很好了,除了小数的长度。