我试图将一个
JavaScript散列函数转换为C#哈希来做同样的事情.我在那里99%,但是我在这个自定义功能中使用了小数位数.
我不知道为什么,但这个函数将散列值转换为十进制,因为某些奇怪的原因,我的问题是生成的小数并不总是相同的长度. C#中的小数位相当长一些,但长度一致.我遇到的问题是因为C#中的舍入与JavaScript不同,我不完全知道要舍入的十进制以创建等效的长度字符串.
我不知道为什么,但这个函数将散列值转换为十进制,因为某些奇怪的原因,我的问题是生成的小数并不总是相同的长度. C#中的小数位相当长一些,但长度一致.我遇到的问题是因为C#中的舍入与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,它只是简单的逆转过程,因此我必须完美地复制所有输入的最终结果.
编辑:
这是有问题的部分.不要问我为什么这样工作,我没写.
// 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代码.
除了小数的长度之外,我把整个事情做得很好.
解决方法
如果你在javascript中使用Number,那么在C#中使用double.两者都是64位IEEE 754数字(双精度).您获得相同的值(验证后更新).