2014-12-27 46 views
0

我需要从这样一串代码创建一个哈希:创建一个字符串的哈希值,并在C#中uinteger

private static function core_md5(_arg_1:Array, _arg_2:uint):Array{ 
    var _local_8:uint; 
    var _local_9:uint; 
    var _local_10:uint; 
    var _local_11:uint; 
    _arg_1[(_arg_2 >> 5)] = (_arg_1[(_arg_2 >> 5)] | (128 << (_arg_2 % 32))); 
    _arg_1[((((_arg_2 + 64) >>> 9) << 4) + 14)] = _arg_2; 
    var _local_3:uint = 1732584193; 
    var _local_4:uint = 4023233417; 
    var _local_5:uint = 2562383102; 
    var _local_6:uint = 271733878; 
    var _local_7:uint; 
    while (_local_7 < _arg_1.length) { 
     _arg_1[_local_7] = ((_arg_1[_local_7]) || (0)); 
     _arg_1[(_local_7 + 1)] = ((_arg_1[(_local_7 + 1)]) || (0)); 
     _arg_1[(_local_7 + 2)] = ((_arg_1[(_local_7 + 2)]) || (0)); 
     _arg_1[(_local_7 + 3)] = ((_arg_1[(_local_7 + 3)]) || (0)); 
     _arg_1[(_local_7 + 4)] = ((_arg_1[(_local_7 + 4)]) || (0)); 
     _arg_1[(_local_7 + 5)] = ((_arg_1[(_local_7 + 5)]) || (0)); 
     _arg_1[(_local_7 + 6)] = ((_arg_1[(_local_7 + 6)]) || (0)); 
     _arg_1[(_local_7 + 7)] = ((_arg_1[(_local_7 + 7)]) || (0)); 
     _arg_1[(_local_7 + 8)] = ((_arg_1[(_local_7 + 8)]) || (0)); 
     _arg_1[(_local_7 + 9)] = ((_arg_1[(_local_7 + 9)]) || (0)); 
     _arg_1[(_local_7 + 10)] = ((_arg_1[(_local_7 + 10)]) || (0)); 
     _arg_1[(_local_7 + 11)] = ((_arg_1[(_local_7 + 11)]) || (0)); 
     _arg_1[(_local_7 + 12)] = ((_arg_1[(_local_7 + 12)]) || (0)); 
     _arg_1[(_local_7 + 13)] = ((_arg_1[(_local_7 + 13)]) || (0)); 
     _arg_1[(_local_7 + 14)] = ((_arg_1[(_local_7 + 14)]) || (0)); 
     _arg_1[(_local_7 + 15)] = ((_arg_1[(_local_7 + 15)]) || (0)); 
     _local_8 = _local_3; 
     _local_9 = _local_4; 
     _local_10 = _local_5; 
     _local_11 = _local_6; 
     _local_3 = ff(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 0)], 7, 3614090360); 
     _local_6 = ff(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 1)], 12, 3905402710); 
     _local_5 = ff(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 2)], 17, 606105819); 
     _local_4 = ff(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 3)], 22, 3250441966); 
     _local_3 = ff(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 4)], 7, 4118548399); 
     _local_6 = ff(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 5)], 12, 1200080426); 
     _local_5 = ff(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 6)], 17, 2821735955); 
     _local_4 = ff(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 7)], 22, 4249261313); 
     _local_3 = ff(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 8)], 7, 1770035416); 
     _local_6 = ff(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 9)], 12, 2336552879); 
     _local_5 = ff(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 10)], 17, 0xFFFF5BB1); 
     _local_4 = ff(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 11)], 22, 2304563134); 
     _local_3 = ff(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 12)], 7, 1804603682); 
     _local_6 = ff(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 13)], 12, 4254626195); 
     _local_5 = ff(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 14)], 17, 2792965006); 
     _local_4 = ff(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 15)], 22, 1236535329); 
     _local_3 = gg(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 1)], 5, 4129170786); 
     _local_6 = gg(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 6)], 9, 3225465664); 
     _local_5 = gg(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 11)], 14, 643717713); 
     _local_4 = gg(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 0)], 20, 3921069994); 
     _local_3 = gg(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 5)], 5, 3593408605); 
     _local_6 = gg(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 10)], 9, 38016083); 
     _local_5 = gg(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 15)], 14, 3634488961); 
     _local_4 = gg(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 4)], 20, 3889429448); 
     _local_3 = gg(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 9)], 5, 568446438); 
     _local_6 = gg(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 14)], 9, 3275163606); 
     _local_5 = gg(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 3)], 14, 4107603335); 
     _local_4 = gg(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 8)], 20, 1163531501); 
     _local_3 = gg(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 13)], 5, 2850285829); 
     _local_6 = gg(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 2)], 9, 4243563512); 
     _local_5 = gg(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 7)], 14, 1735328473); 
     _local_4 = gg(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 12)], 20, 2368359562); 
     _local_3 = hh(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 5)], 4, 4294588738); 
     _local_6 = hh(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 8)], 11, 2272392833); 
     _local_5 = hh(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 11)], 16, 1839030562); 
     _local_4 = hh(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 14)], 23, 4259657740); 
     _local_3 = hh(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 1)], 4, 2763975236); 
     _local_6 = hh(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 4)], 11, 1272893353); 
     _local_5 = hh(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 7)], 16, 4139469664); 
     _local_4 = hh(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 10)], 23, 3200236656); 
     _local_3 = hh(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 13)], 4, 681279174); 
     _local_6 = hh(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 0)], 11, 3936430074); 
     _local_5 = hh(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 3)], 16, 3572445317); 
     _local_4 = hh(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 6)], 23, 76029189); 
     _local_3 = hh(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 9)], 4, 3654602809); 
     _local_6 = hh(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 12)], 11, 3873151461); 
     _local_5 = hh(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 15)], 16, 530742520); 
     _local_4 = hh(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 2)], 23, 3299628645); 
     _local_3 = ii(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 0)], 6, 4096336452); 
     _local_6 = ii(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 7)], 10, 1126891415); 
     _local_5 = ii(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 14)], 15, 2878612391); 
     _local_4 = ii(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 5)], 21, 4237533241); 
     _local_3 = ii(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 12)], 6, 1700485571); 
     _local_6 = ii(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 3)], 10, 2399980690); 
     _local_5 = ii(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 10)], 15, 4293915773); 
     _local_4 = ii(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 1)], 21, 2240044497); 
     _local_3 = ii(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 8)], 6, 1873313359); 
     _local_6 = ii(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 15)], 10, 4264355552); 
     _local_5 = ii(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 6)], 15, 2734768916); 
     _local_4 = ii(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 13)], 21, 1309151649); 
     _local_3 = ii(_local_3, _local_4, _local_5, _local_6, _arg_1[(_local_7 + 4)], 6, 4149444226); 
     _local_6 = ii(_local_6, _local_3, _local_4, _local_5, _arg_1[(_local_7 + 11)], 10, 3174756917); 
     _local_5 = ii(_local_5, _local_6, _local_3, _local_4, _arg_1[(_local_7 + 2)], 15, 718787259); 
     _local_4 = ii(_local_4, _local_5, _local_6, _local_3, _arg_1[(_local_7 + 9)], 21, 3951481745); 
     _local_3 = (_local_3 + _local_8); 
     _local_4 = (_local_4 + _local_9); 
     _local_5 = (_local_5 + _local_10); 
     _local_6 = (_local_6 + _local_11); 
     _local_7 = (_local_7 + 16); 
    }; 
    return ([_local_3, _local_4, _local_5, _local_6]); 
} 

private static function rol(_arg_1:uint, _arg_2:uint):uint{ 
    return (((_arg_1 << _arg_2) | (_arg_1 >>> (32 - _arg_2)))); 
} 

private static function cmn(_arg_1:uint, _arg_2:uint, _arg_3:uint, _arg_4:uint, _arg_5:uint, _arg_6:uint):uint{ 
    return ((rol((((_arg_2 + _arg_1) + _arg_4) + _arg_6), _arg_5) + _arg_3)); 
} 

private static function ff(_arg_1:uint, _arg_2:uint, _arg_3:uint, _arg_4:uint, _arg_5:uint, _arg_6:uint, _arg_7:uint):uint{ 
    return (cmn(((_arg_2 & _arg_3) | (~(_arg_2) & _arg_4)), _arg_1, _arg_2, _arg_5, _arg_6, _arg_7)); 
} 

private static function gg(_arg_1:uint, _arg_2:uint, _arg_3:uint, _arg_4:uint, _arg_5:uint, _arg_6:uint, _arg_7:uint):uint{ 
    return (cmn(((_arg_2 & _arg_4) | (_arg_3 & ~(_arg_4))), _arg_1, _arg_2, _arg_5, _arg_6, _arg_7)); 
} 

private static function hh(_arg_1:uint, _arg_2:uint, _arg_3:uint, _arg_4:uint, _arg_5:uint, _arg_6:uint, _arg_7:uint):uint{ 
    return (cmn(((_arg_2^_arg_3)^_arg_4), _arg_1, _arg_2, _arg_5, _arg_6, _arg_7)); 
} 

private static function ii(_arg_1:uint, _arg_2:uint, _arg_3:uint, _arg_4:uint, _arg_5:uint, _arg_6:uint, _arg_7:uint):uint{ 
    return (cmn((_arg_3^(_arg_2 | ~(_arg_4))), _arg_1, _arg_2, _arg_5, _arg_6, _arg_7)); 
} 

但我不觉得谁拿在参数字符串和uinteger功能/ Framework .NET中的整数。

HashAlgorithm.ComputeHash是否与此函数一样?

http://msdn.microsoft.com/en-us/library/s02tk69a%28v=vs.110%29.aspx

你能帮助我吗?

Cordialy

+0

你确实需要MD5哈希? .NET有一个非常好的MD5实现。 MD5哈希字节,所以你可以序列化你的数据,但你认为合适的(例如,把字符串写成UTF16,并且整数作为它的4字节表示,按照任意顺序),然​​后将结果字节传递给MD5算法进行散列。 – 2014-12-27 19:18:30

+0

谢谢,是的,我需要一个MD5哈希,我会尝试。 – 2014-12-27 19:20:11

回答

0

这里是你如何完成你的目标一个例子:

static byte[] HashMd5(string text, int value) 
{ 
    using (MemoryStream stream = new MemoryStream()) 
    using (BinaryWriter writer = new BinaryWriter(stream)) 
    using (System.Security.Cryptography.HashAlgorithm hash = 
     new System.Security.Cryptography.MD5Cng()) 
    { 
     writer.Write(text); 
     writer.Write(value); 
     writer.Flush(); 

     stream.Position = 0; 

     return hash.ComputeHash(stream); 
    } 
} 

如果你想要的是一些哈希,上面应该对任何情况下的工作。

但是,有很多选择;散列通常用于与先前计算的值进行比较,在散列与之前计算的情况相比较时,您需要确保数据的编码始终完全相同。在上文中,下面需要注意很重要:

  • 的C#string对象正在使用的默认编码为UTF8的BinaryWriter
  • 的C#int值在小端格式
  • 编码为4个字节

在.NET中,如果你总是使用我已经显示的确切代码,它总是会产生相同的散列值。如果您必须在其他某个环境中重新计算散列,那么其他环境可能会有不同的默认值或编码规则(例如,将其文本转换为UTF8),您必须确保以完全相同的方式完成。对于完全相同的输入字节,任何MD5算法都会产生完全相同的结果,但您需要确保输入字节正确(特别是与其他散列相同数据的其他位置相同)。