欢迎来到【cf单板方框源码】【程序开发源码】【php下柱源码】d最优设计 源码_什么是最优设计-皮皮网网站!!!

皮皮网

【cf单板方框源码】【程序开发源码】【php下柱源码】d最优设计 源码_什么是最优设计-皮皮网 扫描左侧二维码访问本站手机端

【cf单板方框源码】【程序开发源码】【php下柱源码】d最优设计 源码_什么是最优设计

2024-11-20 20:44:04 来源:{typename type="name"/} 分类:{typename type="name"/}

1.工程试验优化设计内容简介
2.使用java开发代码编辑器(使用java开发代码编辑器的好处)
3.79C3125EAC1CE25EE2C99A9B01DFC00

d最优设计 源码_什么是最最优最优设计

工程试验优化设计内容简介

       本书深入探讨了工程试验优化设计的理论与实践内容,旨在为工程领域的优设专业人士提供全面的指导。它首先从基础层面讲解工程试验设计的计源基本理念和操作技巧,强调其在工程实践中的设计cf单板方框源码正确运用。内容涵盖了试验设计的最最优基础知识,如试验设计统计基础,优设程序开发源码以及一系列实用的计源试验设计方法,如简单试验设计、设计正交试验设计、最最优回归分析等。优设

       对于较为复杂的计源试验设计,如回归正交设计、设计回归旋转设计、最最优php下柱源码D-最优设计,优设书中都以工程实践为导向,计源用浅显易懂的apk源码转成网站语言进行了详尽的阐述。混料设计和均匀设计也是本书的重点部分,为解决实际工程问题提供了有效的设计策略。

       无论你是多店商城源码高等院校相关专业的本科生还是研究生,或是致力于工程实践的技术人员或科研人员,这本书都是不可或缺的参考资料。它不仅提供理论知识,更是实践应用的指南,有助于提升你在工程试验优化设计领域的理解和应用能力。

使用java开发代码编辑器(使用java开发代码编辑器的好处)

       java编程常用的软件有哪些

       æƒ³è¦åšå¥½Java开发,没有常用的开发工具可不行。而Java初学者往往处于对Java还一知半解的状态,对于Java开发工具的了解也不会太多,常常会为了找开发工具而浪费大量的时间。给大家介绍下Java开发工程师常用的开发工具有哪些。

       ç¬¬ä¸€ä¸ªJava常用的开发工具为JDK,也叫Java软件开发工具包,是一个编写Java的Applet小程序和应用程序的程序开发环境,JDK中还包括了Java的开发环境,所以下载了JDK就包含了Java开发环境。而且JDK之所以被叫做Java软件开发工具包,是因为它包含了其它Java开发工具,如:编译工具(javac.exe)、打包工具(jar.exe)等。

       ç¬¬äºŒä¸ªæ˜¯JavaIDE:Eclipse,Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。而且由于它的平等和一致性,使得其它开发语言也可以在eclipse上使用。

       ç¬¬ä¸‰ä¸ªæ˜¯notepad++,notepad++是一个编译工具,它的优点是即使你把文件删掉了,如果再notepad++中打开过,那么那里就会保留,所以对一些容易误删的人来说比较友好,notepad++可以用来替代notepad。

       ç¬¬å››ä¸ªæ˜¯VisualStudioCode,它是一个运行于MacOSX、Windows和Linux之上的跨平台源代码编辑器。而且这个编辑器支持多种语言和格式的编写。

       ä»¥ä¸Šå°±æ˜¯æ¯”较常用的4种Java开发工具,Java的初学者在对开发工具不了解的情况下,可以根据上述介绍来选择适合自己的开发工具,这样可以减少自己到处找开发工具还可能找到不适合的所浪费的时间。

       å¦‚何用java编写一个简单的文本编辑器?

       importjava.awt.*;\x0d\importjava.awt.event.*;\x0d\importjavax.swing.*;\x0d\importjava.io.*;\x0d\\x0d\publicclassf1extendsFrameimplementsActionListener\x0d\{ \x0d\privateMenuBarmenubar=newMenuBar();\x0d\privateMenufilemenu=newMenu("文件");\x0d\privateMenueditmenu=newMenu("编辑");\x0d\privateMenuformmenu=newMenu("格式");\x0d\privateMenuItem[]itemf=newMenuItem[4];\x0d\privateMenuItem[]iteme=newMenuItem[6];\x0d\privateMenuItem[]items=newMenuItem[2];\x0d\privateTextAreatf=newTextArea();\x0d\\x0d\publicinta=0,b=0,c=0,style=Font.PLAIN,size=;\x0d\publicStrings1="red:"+a+""+"green:"+b+""+"blue"+c,\x0d\s2="宋体";\x0d\\x0d\publicString[]sz1={ "","","","","",""},\x0d\sz2={ "宋体","黑体","幼圆","隶书","行楷","Arial","Georgia"},\x0d\sz3={ "粗体","倾斜","常规","粗斜"};\x0d\\x0d\JDialogdialog=newJDialog(this,"字体",true);\x0d\Containercp=dialog.getContentPane();\x0d\JLabel[]lb=newJLabel[8];\x0d\JLabellb1=newJLabel(s1,JLabel.LEFT);\x0d\JButtonb1=newJButton("确定"),\x0d\b2=newJButton("取消");\x0d\JComboBoxjc1=newJComboBox(),\x0d\jc2=newJComboBox(),\x0d\jc3=newJComboBox();\x0d\JScrollBarjb1=newJScrollBar(JScrollBar.HORIZONTAL,,5,0,);\x0d\JScrollBarjb2=newJScrollBar(JScrollBar.HORIZONTAL,,5,0,);\x0d\JScrollBarjb3=newJScrollBar(JScrollBar.HORIZONTAL,,5,0,);

java源代码编辑器设计用于编写Java源代码的编辑器,基本要求:可以完成源程序的文件打开,编辑和文件保存

       ä¸€.高亮的内容:

       éœ€è¦é«˜äº®çš„内容有:

       1.关键字,如public,int,true等.

       2.运算符,如+,-,*,/等

       3.数字

       4.高亮字符串,如"exampleofstring"

       5.高亮单行注释

       6.高亮多行注释

       äºŒ.实现高亮的核心方法:

       StyledDocument.setCharacterAttributes(intoffset,intlength,AttributeSets,booleanreplace)

       ä¸‰.文本编辑器选择.

       Java中提供的多行文本编辑器有:JTextComponent,JTextArea,JTextPane,JEditorPane等,都可以使用.但是因为语法着色中文本要使用多种风格的样式,所以这些文本编辑器的document要使用StyledDocument.

       JTextArea使用的是PlainDocument,æ­¤document不能进行多种格式的着色.

       JTextPane,JEditorPane使用的是StyledDocument,默认就可以使用.

       ä¸ºäº†å®žçŽ°è¯­æ³•ç€è‰²,可以继承自DefaultStyledDocument,设置其为这些文本编辑器的documet,或者也可以直接使用JTextPane,JEditorPane来做.为了方便,这里就直接使用JTextPane了.

       å››.何时进行着色.

       å½“文本编辑器中有字符被插入或者删除时,文本的内容就发生了变化,这时检查,进行着色.

       ä¸ºäº†ç›‘视到文本的内容发生了变化,要给document添加一个DocumentListener监听器,在他的removeUpdate和insertUpdate中进行着色处理.

       è€ŒchangedUpdate方法在文本的属性例如前景色,背景色,字体等风格改变时才会被调用.

       @Override

       publicvoidchangedUpdate(DocumentEvente){

       }

       @Override

       publicvoidinsertUpdate(DocumentEvente){

       try{

       colouring((StyledDocument)e.getDocument(),e.getOffset(),e.getLength());

       }catch(BadLocationExceptione1){

       e1.printStackTrace();

       }

       }

       @Override

       publicvoidremoveUpdate(DocumentEvente){

       try{

       //因为删除后光标紧接着影响的单词两边,所以长度就不需要了

       colouring((StyledDocument)e.getDocument(),e.getOffset(),0);

       }catch(BadLocationExceptione1){

       e1.printStackTrace();

       }

       }

       äº”.着色范围:

       pos:指变化前光标的位置.

       len:指变化的字符数.

       ä¾‹å¦‚有关键字public,int

       å•è¯"publicint",在"public"和"int"中插入一个空格后变成"publicint",一个单词变成了两个,这时对"public"和"int"进行着色.

       ç€è‰²èŒƒå›´æ˜¯public中p的位置和int中t的位置加1,即是pos前面单词开始的下标和pos+len开始单词结束的下标.所以上例中要着色的范围是"publicint".

       æä¾›äº†æ–¹æ³•indexOfWordStart来取得pos前单词开始的下标,方法indexOfWordEnd来取得pos后单词结束的下标.

       publicintindexOfWordStart(Documentdoc,intpos)throwsBadLocationException{

       //从pos开始向前找到第一个非单词字符.

       for(;pos0isWordCharacter(doc,pos-1);--pos);

       returnpos;

       }

       publicintindexOfWordEnd(Documentdoc,intpos)throwsBadLocationException{

       //从pos开始向前找到第一个非单词字符.

       for(;isWordCharacter(doc,pos);++pos);

       returnpos;

       }

       ä¸€ä¸ªå­—符是单词的有效字符:是字母,数字,下划线.

       publicbooleanisWordCharacter(Documentdoc,intpos)throwsBadLocationException{

       charch=getCharAt(doc,pos);//取得在文档中pos位置处的字符

       if(Character.isLetter(ch)||Character.isDigit(ch)||ch=='_'){ returntrue;}

       returnfalse;

       }

       æ‰€ä»¥ç€è‰²çš„范围是[start,end]:

       intstart=indexOfWordStart(doc,pos);

       intend=indexOfWordEnd(doc,pos+len);

       å…­.关键字着色.

       ä»Žç€è‰²èŒƒå›´çš„开始下标起进行判断,如果是以字母开或者下划线开头,则说明是单词,那么先取得这个单词,如果这个单词是关键字,就进行关键字着色,如果不是,就进行普通的着色.着色完这个单词后,继续后面的着色处理.已经着色过的字符,就不再进行着色了.

       publicvoidcolouring(StyledDocumentdoc,intpos,intlen)throwsBadLocationException{

       //取得插入或者删除后影响到的单词.

       //例如"public"在b后插入一个空格,就变成了:"public",这时就有两个单词要处理:"pub"和"lic"

       //这时要取得的范围是pub中p前面的位置和lic中c后面的位置

       intstart=indexOfWordStart(doc,pos);

       intend=indexOfWordEnd(doc,pos+len);

       charch;

       while(startend){

       ch=getCharAt(doc,start);

       if(Character.isLetter(ch)||ch=='_'){

       //如果是以字母或者下划线开头,说明是单词

       //pos为处理后的最后一个下标

       start=colouringWord(doc,start);

       }else{

       //SwingUtilities.invokeLater(newColouringTask(doc,pos,wordEnd-pos,normalStyle));

       ++start;

       }

       }

       }

       publicintcolouringWord(StyledDocumentdoc,intpos)throwsBadLocationException{

       intwordEnd=indexOfWordEnd(doc,pos);

       Stringword=doc.getText(pos,wordEnd-pos);//要进行着色的单词

       if(keywords.contains(word)){

       //如果是关键字,就进行关键字的着色,否则使用普通的着色.

       //这里有一点要注意,在insertUpdate和removeUpdate的方法调用的过程中,不能修改doc的属性.

       //但我们又要达到能够修改doc的属性,所以把此任务放到这个方法的外面去执行.

       //实现这一目的,可以使用新线程,但放到swing的事件队列里去处理更轻便一点.

       SwingUtilities.invokeLater(newColouringTask(doc,pos,wordEnd-pos,keywordStyle));

       }else{

       SwingUtilities.invokeLater(newColouringTask(doc,pos,wordEnd-pos,normalStyle));

       }

       returnwordEnd;

       }

       å› ä¸ºåœ¨insertUpdate和removeUpdate方法中不能修改document的属性,所以着色的任务放到这两个方法外面,所以使用了SwingUtilities.invokeLater来实现.

       privateclassColouringTaskimplementsRunnable{

       privateStyledDocumentdoc;

       privateStylestyle;

       privateintpos;

       privateintlen;

       publicColouringTask(StyledDocumentdoc,intpos,intlen,Stylestyle){

       this.doc=doc;

       this.pos=pos;

       this.len=len;

       this.style=style;

       }

       publicvoidrun(){

       try{

       //这里就是对字符进行着色

       doc.setCharacterAttributes(pos,len,style,true);

       }catch(Exceptione){ }

       }

       }

       ä¸ƒ:源码

       å…³é”®å­—着色的完成代码如下,可以直接编译运行.对于数字,运算符,字符串等的着色处理在以后的教程中会继续进行详解.

       importjava.awt.Color;

       importjava.util.HashSet;

       importjava.util.Set;

       importjavax.swing.JFrame;

       importjavax.swing.JTextPane;

       importjavax.swing.SwingUtilities;

       importjavax.swing.event.DocumentEvent;

       importjavax.swing.event.DocumentListener;

       importjavax.swing.text.BadLocationException;

       importjavax.swing.text.Document;

       importjavax.swing.text.Style;

       importjavax.swing.text.StyleConstants;

       importjavax.swing.text.StyledDocument;

       publicclassHighlightKeywordsDemo{

       publicstaticvoidmain(String[]args){

       JFrameframe=newJFrame();

       JTextPaneeditor=newJTextPane();

       editor.getDocument().addDocumentListener(newSyntaxHighlighter(editor));

       frame.getContentPane().add(editor);

       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

       frame.setSize(,);

       frame.setVisible(true);

       }

       }

       /

**

       *当文本输入区的有字符插入或者删除时,进行高亮.

       

*

       *要进行语法高亮,文本输入组件的document要是styleddocument才行.所以不要用JTextArea.可以使用JTextPane.

       

*

       *@authorBiao

       

*

       */

       classSyntaxHighlighterimplementsDocumentListener{

       privateSetStringkeywords;

       privateStylekeywordStyle;

       privateStylenormalStyle;

       publicSyntaxHighlighter(JTextPaneeditor){

       //准备着色使用的样式

       keywordStyle=((StyledDocument)editor.getDocument()).addStyle("Keyword_Style",null);

       normalStyle=((StyledDocument)editor.getDocument()).addStyle("Keyword_Style",null);

       StyleConstants.setForeground(keywordStyle,Color.RED);

       StyleConstants.setForeground(normalStyle,Color.BLACK);

       //准备关键字

       keywords=newHashSetString();

       keywords.add("public");

       keywords.add("protected");

       keywords.add("private");

       keywords.add("_int9");

       keywords.add("float");

       keywords.add("double");

       }

       publicvoidcolouring(StyledDocumentdoc,intpos,intlen)throwsBadLocationException{

       //取得插入或者删除后影响到的单词.

       //例如"public"在b后插入一个空格,就变成了:"public",这时就有两个单词要处理:"pub"和"lic"

       //这时要取得的范围是pub中p前面的位置和lic中c后面的位置

       intstart=indexOfWordStart(doc,pos);

       intend=indexOfWordEnd(doc,pos+len);

       charch;

       while(startend){

       ch=getCharAt(doc,start);

       if(Character.isLetter(ch)||ch=='_'){

       //如果是以字母或者下划线开头,说明是单词

       //pos为处理后的最后一个下标

       start=colouringWord(doc,start);

       }else{

       SwingUtilities.invokeLater(newColouringTask(doc,start,1,normalStyle));

       ++start;

       }

       }

       }

       /

**

       *对单词进行着色,并返回单词结束的下标.

       

*

       *@paramdoc

       *@parampos

       *@return

       *@throwsBadLocationException

       */

       publicintcolouringWord(StyledDocumentdoc,intpos)throwsBadLocationException{

       intwordEnd=indexOfWordEnd(doc,pos);

       Stringword=doc.getText(pos,wordEnd-pos);

       if(keywords.contains(word)){

       //如果是关键字,就进行关键字的着色,否则使用普通的着色.

       //这里有一点要注意,在insertUpdate和removeUpdate的方法调用的过程中,不能修改doc的属性.

       //但我们又要达到能够修改doc的属性,所以把此任务放到这个方法的外面去执行.

       //实现这一目的,可以使用新线程,但放到swing的事件队列里去处理更轻便一点.

       SwingUtilities.invokeLater(newColouringTask(doc,pos,wordEnd-pos,keywordStyle));

       }else{

       SwingUtilities.invokeLater(newColouringTask(doc,pos,wordEnd-pos,normalStyle));

       }

       returnwordEnd;

       }

       /

**

CEAC1CEEE2CA9BDFC

       å¯èƒ½æ˜¯ç±»ä¼¼äºŽmd5的加密算法

       ---------------

       md5的全称是message-digest algorithm 5(信息-摘要算法),在年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来,经md2、md3和md4发展而来。它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个位的信息摘要。虽然这些算法的结构或多或少有些相似,但md2的设计与md4和md5完全不同,那是因为md2是为8位机器做过设计优化的,而md4和md5却是面向位的电脑。这三个算法的描述和c语言源代码在internet rfcs 中有详细的描述(h++p://www.ietf.org/rfc/rfc.txt),这是一份最权威的文档,由ronald l. rivest在年8月向ieft提交。

       rivest在年开发出md2算法。在这个算法中,首先对信息进行数据补位,使信息的字节长度是的倍数。然后,以一个位的检验和追加到信息末尾。并且根据这个新产生的信息计算出散列值。后来,rogier和chauvaud发现如果忽略了检验和将产生md2冲突。md2算法的加密后结果是唯一的--既没有重复。

       ä¸ºäº†åŠ å¼ºç®—法的安全性,rivest在年又开发出md4算法。md4算法同样需要填补信息以确保信息的字节长度加上后能被整除(信息字节长度mod = )。然后,一个以位二进制表示的信息的最初长度被添加进来。信息被处理成位damg?rd/merkle迭代结构的区块,而且每个区块要通过三个不同步骤的处理。den boer和bosselaers以及其他人很快的发现了攻击md4版本中第一步和第三步的漏洞。dobbertin向大家演示了如何利用一部普通的个人电脑在几分钟内找到md4完整版本中的冲突(这个冲突实际上是一种漏洞,它将导致对不同的内容进行加密却可能得到相同的加密后结果)。毫无疑问,md4就此被淘汰掉了。

       å°½ç®¡md4算法在安全上有个这么大的漏洞,但它对在其后才被开发出来的好几种信息安全加密算法的出现却有着不可忽视的引导作用。除了md5以外,其中比较有名的还有sha-1、ripe-md以及haval等。

       ä¸€å¹´ä»¥åŽï¼Œå³å¹´ï¼Œrivest开发出技术上更为趋近成熟的md5算法。它在md4的基础上增加了"安全-带子"(safety-belts)的概念。虽然md5比md4稍微慢一些,但却更为安全。这个算法很明显的由四个和md4设计有少许不同的步骤组成。在md5算法中,信息-摘要的大小和填充的必要条件与md4完全相同。den boer和bosselaers曾发现md5算法中的假冲突(pseudo-collisions),但除此之外就没有其他被发现的加密后结果了。

       van oorschot和wiener曾经考虑过一个在散列中暴力搜寻冲突的函数(brute-force hash function),而且他们猜测一个被设计专门用来搜索md5冲突的机器(这台机器在年的制造成本大约是一百万美元)可以平均每天就找到一个冲突。但单从年到年这年间,竟没有出现替代md5算法的md6或被叫做其他什么名字的新算法这一点,我们就可以看出这个瑕疵并没有太多的影响md5的安全性。上面所有这些都不足以成为md5的在实际应用中的问题。并且,由于md5算法的使用不需要支付任何版权费用的,所以在一般的情况下(非绝密应用领域。但即便是应用在绝密领域内,md5也不失为一种非常优秀的中间技术),md5怎么都应该算得上是非常安全的了。

       ç®—法的应用

       md5的典型应用是对一段信息(message)产生信息摘要(message-digest),以防止被篡改。比如,在unix下有很多软件在下载的时候都有一个文件名相同,文件扩展名为.md5的文件,在这个文件中通常只有一行文本,大致结构如:

       md5 (tanajiya.tar.gz) = 0cab9c0fade

       è¿™å°±æ˜¯tanajiya.tar.gz文件的数字签名。md5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的md5信息摘要。如果在以后传播这个文件的过程中,无论文件的内容发生了任何形式的改变(包括人为修改或者下载过程中线路不稳定引起的传输错误等),只要你对这个文件重新计算md5时就会发现信息摘要不相同,由此可以确定你得到的只是一个不正确的文件。如果再有一个第三方的认证机构,用md5还可以防止文件作者的"抵赖",这就是所谓的数字签名应用。

       md5还广泛用于加密和解密技术上。比如在unix系统中用户的密码就是以md5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成md5值,然后再去和保存在文件系统中的md5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。

       æ­£æ˜¯å› ä¸ºè¿™ä¸ªåŽŸå› ï¼ŒçŽ°åœ¨è¢«é»‘客使用最多的一种破译密码的方法就是一种被称为"跑字典"的方法。有两种方法得到字典,一种是日常搜集的用做密码的字符串表,另一种是用排列组合方法生成的,先用md5程序计算出这些字典项的md5值,然后再用目标的md5值在这个字典中检索。我们假设密码的最大长度为8位字节(8 bytes),同时密码只能是字母和数字,共++=个字符,排列组合出的字典的项数则是p(,1)+p(,2)….+p(,8),那也已经是一个很天文的数字了,存储这个字典就需要tb级的磁盘阵列,而且这种方法还有一个前提,就是能获得目标账户的密码md5值的情况下才可以。这种加密技术被广泛的应用于unix系统中,这也是为什么unix系统比一般操作系统更为坚固一个重要原因。

       ç®—法描述

       å¯¹md5算法简要的叙述可以为:md5以位分组来处理输入的信息,且每一分组又被划分为个位子分组,经过了一系列的处理后,算法的输出由四个位分组组成,将这四个位分组级联后将生成一个位散列值。

       åœ¨md5算法中,首先需要对信息进行填充,使其字节长度对求余的结果等于。因此,信息的字节长度(bits length)将被扩展至n*+,即n*+个字节(bytes),n为一个正整数。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在在这个结果后面附加一个以位二进制表示的填充前信息长度。经过这两步的处理,现在的信息字节长度=n*++=(n+1)*,即长度恰好是的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。

       md5中有四个位被称作链接变量(chaining variable)的整数参数,他们分别为:a=0x,b=0xabcdef,c=0xfedcba,d=0x。

       å½“设置好这四个链接变量后,就开始进入算法的四轮循环运算。循环的次数是信息中位信息分组的数目。

       å°†ä¸Šé¢å››ä¸ªé“¾æŽ¥å˜é‡å¤åˆ¶åˆ°å¦å¤–四个变量中:a到a,b到b,c到c,d到d。

       ä¸»å¾ªçŽ¯æœ‰å››è½®ï¼ˆmd4只有三轮),每轮循环都很相似。第一轮进行次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。

       ä»¥ä¸€ä¸‹æ˜¯æ¯æ¬¡æ“ä½œä¸­ç”¨åˆ°çš„四个非线性函数(每轮一个)。

       f(x,y,z) =(x&y)|((~x)&z)

       g(x,y,z) =(x&z)|(y&(~z))

       h(x,y,z) =x^y^z

       i(x,y,z)=y^(x|(~z))

       ï¼ˆ&是与,|是或,~是非,^是异或)

       è¿™å››ä¸ªå‡½æ•°çš„说明:如果x、y和z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。

       f是一个逐位运算的函数。即,如果x,那么y,否则z。函数h是逐位奇偶操作符。

       å‡è®¾mj表示消息的第j个子分组(从0到),<<

       ff(a,b,c,d,mj,s,ti)表示a=b+((a+(f(b,c,d)+mj+ti)<< gg(a,b,c,d,mj,s,ti)表示a=b+((a+(g(b,c,d)+mj+ti)<< hh(a,b,c,d,mj,s,ti)表示a=b+((a+(h(b,c,d)+mj+ti)<< ii(a,b,c,d,mj,s,ti)表示a=b+((a+(i(b,c,d)+mj+ti)<<

       è¿™å››è½®ï¼ˆæ­¥ï¼‰æ˜¯ï¼š

       ç¬¬ä¸€è½®

       ff(a,b,c,d,m0,7,0xdaa)

       ff(d,a,b,c,m1,,0xe8c7b)

       ff(c,d,a,b,m2,,0xdb)

       ff(b,c,d,a,m3,,0xc1bdceee)

       ff(a,b,c,d,m4,7,0xfc0faf)

       ff(d,a,b,c,m5,,0xca)

       ff(c,d,a,b,m6,,0xa)

       ff(b,c,d,a,m7,,0xfd)

       ff(a,b,c,d,m8,7,0xd8)

       ff(d,a,b,c,m9,,0x8bf7af)

       ff(c,d,a,b,m,,0xffff5bb1)

       ff(b,c,d,a,m,,0xcd7be)

       ff(a,b,c,d,m,7,0x6b)

       ff(d,a,b,c,m,,0xfd)

       ff(c,d,a,b,m,,0xae)

       ff(b,c,d,a,m,,0xb)

       ç¬¬äºŒè½®

       gg(a,b,c,d,m1,5,0xfe)

       gg(d,a,b,c,m6,9,0xcb)

       gg(c,d,a,b,m,,0xe5a)

       gg(b,c,d,a,m0,,0xe9b6c7aa)

       gg(a,b,c,d,m5,5,0xdfd)

       gg(d,a,b,c,m,9,0x)

       gg(c,d,a,b,m,,0xd8a1e)

       gg(b,c,d,a,m4,,0xe7d3fbc8)

       gg(a,b,c,d,m9,5,0xe1cde6)

       gg(d,a,b,c,m,9,0xcd6)

       gg(c,d,a,b,m3,,0xf4dd)

       gg(b,c,d,a,m8,,0xaed)

       gg(a,b,c,d,m,5,0xa9e3e)

       gg(d,a,b,c,m2,9,0xfcefa3f8)

       gg(c,d,a,b,m7,,0xfd9)

       gg(b,c,d,a,m,,0x8d2a4c8a)

       ç¬¬ä¸‰è½®

       hh(a,b,c,d,m5,4,0xfffa)

       hh(d,a,b,c,m8,,0xf)

       hh(c,d,a,b,m,,0x6d9d)

       hh(b,c,d,a,m,,0xfdec)

       hh(a,b,c,d,m1,4,0xa4beea)

       hh(d,a,b,c,m4,,0x4bdecfa9)

       hh(c,d,a,b,m7,,0xf6bb4b)

       hh(b,c,d,a,m,,0xbebfbc)

       hh(a,b,c,d,m,4,0xb7ec6)

       hh(d,a,b,c,m0,,0xeaafa)

       hh(c,d,a,b,m3,,0xd4ef)

       hh(b,c,d,a,m6,,0xd)

       hh(a,b,c,d,m9,4,0xd9d4d)

       hh(d,a,b,c,m,,0xe6dbe5)

       hh(c,d,a,b,m,,0x1facf8)

       hh(b,c,d,a,m2,,0xc4ac)

       ç¬¬å››è½®

       ii(a,b,c,d,m0,6,0xf)

       ii(d,a,b,c,m7,,0xaff)

       ii(c,d,a,b,m,,0xaba7)

       ii(b,c,d,a,m5,,0xfca)

       ii(a,b,c,d,m,6,0xbc3)

       ii(d,a,b,c,m3,,0x8f0ccc)

       ii(c,d,a,b,m,,0xffeffd)

       ii(b,c,d,a,m1,,0xdd1)

       ii(a,b,c,d,m8,6,0x6fae4f)

       ii(d,a,b,c,m,,0xfe2ce6e0)

       ii(c,d,a,b,m6,,0xa)

       ii(b,c,d,a,m,,0x4ea1)

       ii(a,b,c,d,m4,6,0xfe)

       ii(d,a,b,c,m,,0xbd3af)

       ii(c,d,a,b,m2,,0x2ad7d2bb)

       ii(b,c,d,a,m9,,0xebd)

       å¸¸æ•°ti可以如下选择:

       åœ¨ç¬¬i步中,ti是*abs(sin(i))的整数部分,i的单位是弧度。(等于2的次方)

       æ‰€æœ‰è¿™äº›å®Œæˆä¹‹åŽï¼Œå°†a、b、c、d分别加上a、b、c、d。然后用下一分组数据继续运行算法,最后的输出是a、b、c和d的级联。

       å½“你按照我上面所说的方法实现md5算法以后,你可以用以下几个信息对你做出来的程序作一个简单的测试,看看程序有没有错误。

       md5 ("") = dd8cdfbeecfe

       md5 ("a") = 0ccb9c0f1b6ace

       md5 ("abc") = cdfb0df7def

       md5 ("message digest") = fbd7cbda2faafd0

       md5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3dedfbccaeb

       md5 ("abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz") =

       dabdd9f5ac2c9fd9f

       md5 ("

       ") = edf4abe3cacda2eba

       å¦‚果你用上面的信息分别对你做的md5算法实例做测试,最后得出的结论和标准答案完全一样,那我就要在这里象你道一声祝贺了。要知道,我的程序在第一次编译成功的时候是没有得出和上面相同的结果的。

       md5的安全性

       md5相对md4所作的改进:

       1. 增加了第四轮;

       2. 每一步均有唯一的加法常数;

       3. 为减弱第二轮中函数g的对称性从(x&y)|(x&z)|(y&z)变为(x&z)|(y&(~z));

       4. 第一步加上了上一步的结果,这将引起更快的雪崩效应;

       5. 改变了第二轮和第三轮中访问消息子分组的次序,使其更不相似;

       6. 近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应。各轮的位移量互不相同。

       [color=red]简单的说:

       MD5叫信息-摘要算法,是一种密码的算法,它可以对任何文件产生一个唯一的MD5验证码,每个文件的MD5码就如同每个人的指纹一样,都是不同的,这样,一旦这个文件在传输过程中,其内容被损坏或者被修改的话,那么这个文件的MD5码就会发生变化,通过对文件MD5的验证,可以得知获得的文件是否完整。