[as3.0]flash md5算法

今天做东西需要一个MD5算法,就是网上找了一个,因为是在FLEX里面用,所以顺便转成了AS3.0的.代码如下:

 

package net.smilecn.share {

    public class Md5 
{

        private static  
var hexcase:Number=0;
        private static  
var strsize:Number=8;
        public 
function Md5() {

        }

        public static 
function getMd5(pass:String):String {
            
return binl2hex(core_md5(str2binl(pass),pass.length * strsize));
        }

        public static 
function core_md5(x:Array, len:Number):Array {
            x[len 
>> 5= (x[len >> 5]) | (128 << len%32);
            x[(((len
+64>>> 9<< 4)+14= len;
            
            
var a:Number = 1732584193;
            
var b:Number = -271733879;
            
var c:Number = -1732584194;
            
var d:Number = 271733878;
            
var i:Number = 0;
            
while (i<x.length) {
                
var olda:Number = a;
                
var oldb:Number = b;
                
var oldc:Number = c;
                
var oldd:Number = d;
                a 
= md5_ff(a, b, c, d, x[i+0], 7-680876936);
                d 
= md5_ff(d, a, b, c, x[i+1], 12-389564586);
                c 
= md5_ff(c, d, a, b, x[i+2], 17606105819);
                b 
= md5_ff(b, c, d, a, x[i+3], 22-1044525330);
                a 
= md5_ff(a, b, c, d, x[i+4], 7-176418897);
                d 
= md5_ff(d, a, b, c, x[i+5], 121200080426);
                c 
= md5_ff(c, d, a, b, x[i+6], 17-1473231341);
                b 
= md5_ff(b, c, d, a, x[i+7], 22-45705983);
                a 
= md5_ff(a, b, c, d, x[i+8], 71770035416);
                d 
= md5_ff(d, a, b, c, x[i+9], 12-1958414417);
                c 
= md5_ff(c, d, a, b, x[i+10], 17-42063);
                b 
= md5_ff(b, c, d, a, x[i+11], 22-1990404162);
                a 
= md5_ff(a, b, c, d, x[i+12], 71804603682);
                d 
= md5_ff(d, a, b, c, x[i+13], 12-40341101);
                c 
= md5_ff(c, d, a, b, x[i+14], 17-1502002290);
                b 
= md5_ff(b, c, d, a, x[i+15], 221236535329);
                a 
= md5_gg(a, b, c, d, x[i+1], 5-165796510);
                d 
= md5_gg(d, a, b, c, x[i+6], 9-1069501632);
                c 
= md5_gg(c, d, a, b, x[i+11], 14643717713);
                b 
= md5_gg(b, c, d, a, x[i+0], 20-373897302);
                a 
= md5_gg(a, b, c, d, x[i+5], 5-701558691);
                d 
= md5_gg(d, a, b, c, x[i+10], 938016083);
                c 
= md5_gg(c, d, a, b, x[i+15], 14-660478335);
                b 
= md5_gg(b, c, d, a, x[i+4], 20-405537848);
                a 
= md5_gg(a, b, c, d, x[i+9], 5568446438);
                d 
= md5_gg(d, a, b, c, x[i+14], 9-1019803690);
                c 
= md5_gg(c, d, a, b, x[i+3], 14-187363961);
                b 
= md5_gg(b, c, d, a, x[i+8], 201163531501);
                a 
= md5_gg(a, b, c, d, x[i+13], 5-1444681467);
                d 
= md5_gg(d, a, b, c, x[i+2], 9-51403784);
                c 
= md5_gg(c, d, a, b, x[i+7], 141735328473);
                b 
= md5_gg(b, c, d, a, x[i+12], 20-1926607734);
                a 
= md5_hh(a, b, c, d, x[i+5], 4-378558);
                d 
= md5_hh(d, a, b, c, x[i+8], 11-2022574463);
                c 
= md5_hh(c, d, a, b, x[i+11], 161839030562);
                b 
= md5_hh(b, c, d, a, x[i+14], 23-35309556);
                a 
= md5_hh(a, b, c, d, x[i+1], 4-1530992060);
                d 
= md5_hh(d, a, b, c, x[i+4], 111272893353);
                c 
= md5_hh(c, d, a, b, x[i+7], 16-155497632);
                b 
= md5_hh(b, c, d, a, x[i+10], 23-1094730640);
                a 
= md5_hh(a, b, c, d, x[i+13], 4681279174);
                d 
= md5_hh(d, a, b, c, x[i+0], 11-358537222);
                c 
= md5_hh(c, d, a, b, x[i+3], 16-722521979);
                b 
= md5_hh(b, c, d, a, x[i+6], 2376029189);
                a 
= md5_hh(a, b, c, d, x[i+9], 4-640364487);
                d 
= md5_hh(d, a, b, c, x[i+12], 11-421815835);
                c 
= md5_hh(c, d, a, b, x[i+15], 16530742520);
                b 
= md5_hh(b, c, d, a, x[i+2], 23-995338651);
                a 
= md5_ii(a, b, c, d, x[i+0], 6-198630844);
                d 
= md5_ii(d, a, b, c, x[i+7], 101126891415);
                c 
= md5_ii(c, d, a, b, x[i+14], 15-1416354905);
                b 
= md5_ii(b, c, d, a, x[i+5], 21-57434055);
                a 
= md5_ii(a, b, c, d, x[i+12], 61700485571);
                d 
= md5_ii(d, a, b, c, x[i+3], 10-1894986606);
                c 
= md5_ii(c, d, a, b, x[i+10], 15-1051523);
                b 
= md5_ii(b, c, d, a, x[i+1], 21-2054922799);
                a 
= md5_ii(a, b, c, d, x[i+8], 61873313359);
                d 
= md5_ii(d, a, b, c, x[i+15], 10-30611744);
                c 
= md5_ii(c, d, a, b, x[i+6], 15-1560198380);
                b 
= md5_ii(b, c, d, a, x[i+13], 211309151649);
                a 
= md5_ii(a, b, c, d, x[i+4], 6-145523070);
                d 
= md5_ii(d, a, b, c, x[i+11], 10-1120210379);
                c 
= md5_ii(c, d, a, b, x[i+2], 15718787259);
                b 
= md5_ii(b, c, d, a, x[i+9], 21-343485551);
                a 
= safe_add(a, olda);
                b 
= safe_add(b, oldb);
                c 
= safe_add(c, oldc);
                d 
= safe_add(d, oldd);
                i 
= i+16;
            }

            
            
return new Array(a,b,c,d);
            
        }

        private static 
function md5_cmn(q:Number, a:Number, b:Number, x:Number, s:Number, t:Number):Number {
            
return safe_add(bit_rol(safe_add(safe_add(a,q),safe_add(x,t)),s),b);
        }

        private static 
function md5_ff(a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number {
            
return md5_cmn(b & c | ~ b & d,a,b,x,s,t);
        }

        private static 
function md5_gg(a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number {
            
return md5_cmn(b & d | c & ~ d,a,b,x,s,t);
        }

        private static 
function md5_hh(a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number {
            
return md5_cmn(b ^ c ^ d,a,b,x,s,t);
        }

        private static 
function md5_ii(a:Number, b:Number, c:Number, d:Number, x:Number, s:Number, t:Number):Number {
            
return md5_cmn(c ^ b | ~ d,a,b,x,s,t);
        }

        private static 
function safe_add(x:Number, y:Number):Number {
            
var lsw:Number = (x & 65535)+(y & 65535);
            
var msw:Number = ((x >> 16)+(y >> 16))+(lsw >> 16);
            
return msw << 16 | lsw & 65535;
        }

        private static 
function bit_rol(num:Number, cnt:Number):Number {
            
return num << cnt | num >>> 32 - cnt;
        }

        private static 
function str2binl(str:String):Array {
            
var bin:Array = new Array();
            
var mask:Number = (1 << strsize)-1;
            
var i:Number = 0;
            
while (i<(str.length*strsize)) {
                bin[i 
>> 5= (bin[i >> 5]) | ((str.charCodeAt(i/strsize) & mask) << i%32);
                i 
= i+strsize;
            }

            
return bin;
        }

        private static 
function binl2hex(binarray:Array):String {
            
if (hexcase) {
            }
 else {
            }

            
var hex_tab:String = "0123456789abcdef";
            
var str:String = "";
            
var i:Number = 0;
            
while (i<(binarray.length*4)) {
                str 
= str+(hex_tab.charAt(((binarray[i >> 2]) >> ((i%4*8)+4)) & 15)+hex_tab.charAt(((binarray[i >> 2]) >> (i%4*8)) & 15));
                i
++;
            }

            
return str;
        }

    }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
根据提供的引用内容,似乎是Unity3D中的代码,而不是AS3.0。不过,背包算法AS3.0中同样适用。下面是一个简单的背包算法实现: ```actionscript // 定义物品类 class Item { public var name:String; public var weight:Number; public var value:Number; public function Item(name:String, weight:Number, value:Number) { this.name = name; this.weight = weight; this.value = value; } } // 背包算法函数 function knapsack(items:Array, capacity:Number):Array { var n:int = items.length; var dp:Array = new Array(n + 1); for (var i:int = 0; i <= n; i++) { dp[i] = new Array(capacity + 1); for (var j:int = 0; j <= capacity; j++) { dp[i][j] = 0; } } for (i = 1; i <= n; i++) { for (j = 1; j <= capacity; j++) { if (items[i - 1].weight > j) { dp[i][j] = dp[i - 1][j]; } else { dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - items[i - 1].weight] + items[i - 1].value); } } } var result:Array = new Array(); j = capacity; for (i = n; i > 0 && j > 0; i--) { if (dp[i][j] != dp[i - 1][j]) { result.push(items[i - 1]); j -= items[i - 1].weight; } } return result; } // 测试代码 var items:Array = [ new Item("物品1", 2, 3), new Item("物品2", 3, 4), new Item("物品3", 4, 5), new Item("物品4", 5, 8), new Item("物品5", 9, 10) ]; var capacity:Number = 10; var result:Array = knapsack(items, capacity); for each (var item:Item in result) { trace(item.name); } ``` 上述代码实现了一个简单的背包算法,用于在给定物品列表和背包容量的情况下,计算出能够放入背包的物品列表,使得这些物品的总价值最大。具体实现过程中,使用了动态规划的思想,通过填表的方式计算出最优解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值