1.什么是基线?
2.什么是基线
3.Android Adb 源码分析(一)
4.什么是软件配置管理系统
5.Linux C/C++源码实现常见命令mkdir
6.79C3125EAC1CE25EE2C99A9B01DFC00
什么是基线?
“基线”是一个很常见的术语,在配置管理和项目管理里面都能看到,而且还有很多衍生的术语,例如基线提升、基线化、基线审计,idea插件显示源码等等等等。 我个人以前对微软的那套开发流程(就是product cycle model)以及PSP、TSP了解比较多一些,这些流程里面对“基线”的概念提的不多。但接触RUP、MSF以及项目管理以后,看到到处都有baseline,就觉得迷惑了。 经过我自己的理解,以及和几个同事的讨论,现在我觉得我们通常看到的“基线”这个术语有两个意思: 1)代表多个源代码文件的一组版本。 比如有三个文件,aaa.c、bbb.c和ccc.h。可以对这三个文件做一个基线,取aaa.c的版本1.1,取bbb.c的版本1.3,取ccc.h的版本1.0。(1.1,1.3,1.0)就是一个基线。换句话说,通常在vss和cvs里面做label,就是在做基线。 这种基线对“构建审计”特别有用:在做build的时候,可以先对所有源文件做一个label,取名为"Build",然后再编译、集成。这样,以后如果要找到和build 对应的原文件,只需要到vss或者cvs里面把所有文件对应label Build的版本取回来就可以了。 2)代表文档的一个稳定状态。 比如有一个项目设计文档,当设计基本完成,开发即将开始的时候,需要把这个文档固定下来,内容不能再频繁改变,否则开发人员就无所适从了,可能导致每个人所参照的文档并不是同一个文档。用一句上海这里的生活用语来说,就叫做要把这个文档“敲定”。 一个文档如果经过讨论被通过了,被固定了,就可以说这个文档被“基线化”了,然后所有人就可以在这个“基线”的基础上工作。 当然,文档不可能一成不变,所以当对文档的修改仍然会不断进行,但这种修改并不会随时随地的添加到被“基线化”了的文档中去。因为既然是“基线”,就不能随便动。 但是到了一定时候,修改积累到一定程度,就需要把很多修改合并到原来的文档中去了,并生成一个新版本的文档作为团队中所有的人的参考标准,并把老的版本淘汰掉。这就叫做“基线提升”。 以上就是我个人对“基线”这个术语的两种不同含义的理解,大家可以讨论讨论看,是不是差不多就是这个意思。3)合同基线当你和客户讨论后,“敲定”的合同4)发行基线你会对你要发行的代码,文档版本进行label, 比如Release2.2,5)产品基线
什么是基线
基线在配置管理和项目管理中扮演着关键角色,涉及多个领域,如版本控制、文档管理以及合同确认等。iapp管理信息的源码本文将探讨基线的两种主要含义:
首先,基线通常指的是源代码文件的一组版本集合。比如,aaa.c、bbb.c和ccc.h三个文件,如果设置为版本1.1、1.3和1.0,这组特定版本组合就构成了一个基线。在版本控制系统如VSS或CVS中,创建标签(label)的过程即是在做基线。在构建项目时,通过创建一个名为"Build"的标签,可以确保所有源文件处于同一状态,方便后续追踪和版本回溯。
其次,基线也指文档的一个稳定状态。在项目开发中,设计文档等重要文件在确定后,会被“敲定”并基线化,以避免频繁变动导致团队成员使用的不一致。任何对文档的修改必须在特定的基线版本上进行,然后在积累到一定程度时,通过“基线提升”合并到主文档中,形成新的版本作为团队参考标准。
此外,基线还可能涉及到合同的确定(合同基线)和软件发布(发行基线)的固定版本,如与客户协商后的合同文本,或为确保产品质量而对代码和文档的特定版本标签(如Release 2.2)。
总结来说,基线是项目管理和版本控制中的重要概念,它涵盖了代码版本的固定、文档状态的稳定以及合同和发行版本的确定,是项目管理流程中的重要组成部分。
Android Adb 源码分析(一)
面对Android项目的调试困境,我们的团队在项目临近量产阶段,将userdebug版本切换为了user版本,并对selinux权限进行了调整。然而,这一转变却带来了大量的bug,日志文件在/data/logs/目录下,因为权限问题无法正常pull出来,导致问题定位变得异常困难。面对这一挑战,我们尝试了两种解决方案。
首先,我们尝试修改data目录的权限,使之成为system用户,以期绕过权限限制,然而数据目录下的logs文件仍保留了root权限,因此获取日志依然需要root权限,这并未解决问题。随后,我们找到了一个相对安全的解决办法——通过adb命令的后门机制,将获取root权限的命令修改为adb aaa.bbb.ccc.root。这一做法在一定程度上增加了后门的隐蔽性,避免了被窃取,同时对日常开发的影响也降至最低。
在解决这一问题的过程中,我们对Android ADB的相关知识有了更深入的理解。ADB是Android系统中用于调试的工具,它主要由三部分构成:adb client、adb service和adb daemon。其中,adb client运行于主机端,提供了命令接口;adb service作为一个后台进程,位于主机端;adb daemon则是运行于设备端(实际机器或模拟器)的守护进程。这三个组件共同构成了ADB工具的完整框架,且它们的代码主要来源于system/core/adb目录,用户可以在此目录下找到adb及adbd的源代码。
为了实现解决方案二,流量卡充值平台源码我们对adb的代码进行了修改,并通过Android SDK进行编译。具体步骤包括在Windows环境下编译生成adb.exe,以及在设备端编译adbd服务。需要注意的是,在进行编译前,需要先建立Android的编译环境。经过对ADB各部分关系及源代码结构的梳理,我们对ADB有了更深入的理解。
在后续的开发过程中,我们将继续深入研究ADB代码,尤其是关于如何实现root权限的功能。如果大家觉得我们的分享有价值,欢迎关注我们的微信公众号“嵌入式Linux”,一起探索更多关于Android调试的技巧与知识。
什么是软件配置管理系统
软件配置管理包括标识、控制、状态统计、审计和审查、生产、过程管理、小组协作。至于怎样才算是构成软件配置管理系统,对此还没有普遍认可的定义。例如,假如系统有版本控制功能,它是否就是一个软件配置管理系统?理想的软件配置管理系统是基于以上定义提供所有功能的系统。但是,实际中的系统只能实现某种程度上的版本控制功能、配置识别功能、系统构建功能、系统建模功能,或在某种程度上提供软件配置管理的意识,软件工程组会认为这些系统就是软件配置管理系统。现有的软件配置管理系统提供的只是一种功能的综合,而不是一个标准的系统。
下面介绍软件配置管理系统的两个重要概念:库和分布式组件。
(1)库
库是软件配置管理系统的根本。库是集中控制的文件库,并提供对库中所存储文件的版本控制。任何库中的文件都被视为在确定的软件配置管理之下。库中的文件是不会变的,即它们不能被更改。任何更改都被视为构造了一个新版本的文件。文件所有的软件配置管理信息和文件的内容都存储在库中。所以,任何配置的管理和控制都与库中的文件相关联。当工作于一个文件时,用户将某个版本的文件导入到自己的工作目录,然后开始工作;处理完后再将文件导回到库中。这样就生成了这个文件的新版本。因此,用户不可能导出一个文件并同时在库中修改源文件。
从库的角度来看,导出的文件被自动锁定直到文件重新被导入,一个版本号自动与新版本文件相关联。这样一来,用户可以随时根据特定的版本号导出任何文件。最新版本修改的结果将产生一个新的、顺序递增的版本;而对老版本修改的结果将产生一个分支版本。在版本编号策略和使用模式的共同作用下,产生了文件版本历史树,用来表示原始和更新后的版本。库中不但存储了文件的不同版本、更改的理由,而且存储了谁在什么时候替换了某个版本的文件等文件历史信息。注意,对于每个不同的版本文件,不是所有的代码都能被存储起来,而只是哪个轻论坛源码好将不同版本间的差异进行存储,这称为增量。这种方法有利于节省空间以及节省对最新文件版本的访问时间。另外,可以根据状态给文件加上标签,然后基于状态的值进行导出。同样也可以根据修订版本号、日期和作者进行导出操作。因为,库总是和文件所在的目录相关联的。
总之,库控制软件配置管理信息,并把不同版本的文件存储为不可修改的对象。
(2)分布式组件
根据下面给出的例子阐述分布式组件。
Sherpa设计管理系统提供一个文件库,其中的文件分散地分布在不同的硬件平台上。在逻辑上,库是集中控制的;但在物理上,库中的数据是分散的。Sherpa设计管理系统自己知道数据的分散分布,并把这个因素考虑到软件配置管理系统中,如在提供必要的文件格式转换时提供一定的容错能力。
这样,对于用户来说,数据的分布是透明的。一组在地理上分散分布的用户可以针对同样配置的文件一起工作。多个文件的副本可以存在于在不同的工作站上。Sherpa设计管理系统知道最新文件版本的位置。对从库中所导出文件的任何更改都会导致所有分散在本地工作站上的副本更新,因为系统知道所有本地副本放置的位置。更新可以是一步一步交互式地发生,也可以是批处理式地完成。有效、分散分布的用户能够直接访问集中控制的库。对他们来说,软件配置管理能力看起来遍布整个异构网络。
软件配置管理系统的发展
软件配置管理系统的发展经历了两代。第一代软件配置管理系统仅仅只是处理文件版本控制的工具。它们是基于单一文件的工具,将各独立文件改变存储在特殊的文档文件之中,一般支持恢复提交模式,并提供分支。最早的这类工具是源代码控制系统,这些都是面向开发而并非管理的、简单的和独立的工具。
第二代软件配置管理系统则是基于项目数据库的,其最显著的特征是软件开发项目的源代码与它们的文档分离,而存储在一个数据库中,该数据库称为项目数据库或软件库。它们能够处理复杂的元素,提供不同的版本模型,是一个集成版本管理和项目组建功能的工具。例如,领域软件工程环境在实现对文件进行版本管理的基础上,应用了系统模型的描述和版本绑定等策略来支持项目组建,但这些工具仅仅是支持编码阶段的工具。
软件配置管理系统的功能
在软件开发团队中,基于软件配置管理的不同成员通常都有一些明确的、互补的需求与任务。换句话就是,理想的软件配置管理系统的功能应支持不同成员的所有目标、规则和任务。由此得出软件配置管理系统的功能需求图,如图1所示。
如图1所示显示了项目经理、配置管理者、软件工程师、测试者、质量保证经理及客户对软件配置管理系统的要求。图1所示中的每一个方框代表的是一个主要的功能区域。图1所示显示方框外的string源码中的value内容,包括部件、结构、创建、审核、统计、控制、团队、过程等,这些也是任何软件配置管理系统都应具备的功能。
软件配置管理系统的建立
在项目实际工作中,可以用VSS、CVS等工具来建立配置库。VSS(Visual SourceSafe)是Microsoft公司推出的配置管理工具,是Visual Studio的套件之一。CVS(Concurrent Version System,并行版本系统)是著名的开放源代码的配置管理工具,许多软件机构根据CVS官方提供的编程接口开发了各色各样的CVS客户端软件,最有名的当推Windows环境的CVS客户端软件——WinCVS,WinCVS是免费的,但是并不开放源代码。
1.建立配置管理系统的步骤
建立配置管理系统的步骤如下:
(1)组建配置管理方案构造小组。这个小组负责构造配置管理过程中的所有工作,包括了解本组织的现有开发、管理现状,选择配置管理工具,制订配置管理规范,安排试验项目的实施,沟通部门间关系,获得管理者支持和开发人员的认同。配置管理方案构造小组的成员应该包括:小组负责人、技术支持专家、配置管理技术专家、配置管理系统用户代表。
(2)对目标机构进行了解、评估。目标机构的调查评估工作由配置管理技术专家领导,配置管理系统用户代表参与,提供基本信息,并由小组负责人协调,对相关部门人员进行深入调查获得较全面的数据。对目标机构的了解、评估应从这几个方面入手:人员、技术、工作流程、现有项目和期望值。
(3)配置管理工具及其提供商评估。通过对组织的评估,了解该组织的现状和需求后,就需要选择适合该组织的配置管理工具。市场上现有的配置管理工具不下数十种,它们各有所长,在功能、性能等方面有较大的差别,只有经过仔细地对产品及其提供商进行分析评估,核对目标机构的需求,才能挑选出合适的工具,实现一个理想的配置管理过程。
(4)制订实施计划。
(5)定义配置管理流程。配置管理流程是软件开发机构进行配置管理的依据,也是配置管理构造小组的最重要的工作成果。配置管理流程规定开发过程中需要做哪些配置管理方面的工作,由谁做、如何做。
(6)试验项目的实施。这一阶段的任务是选取目标机构中的一个现有项目,按既定的配置管理流程去进行开发和配置管理工作。这种试验的目的是在一定风险范围内,通过实地运作来确定所选配置管理工具、所制订的配置管理规范是否能满足目标机构的需要。
(7)全面实施。经过试验项目证实、校正后的配置管理流程就可以在目标机构的各个项目、各个相关工作环节中去应用、实施,最终使配置管理过程日常化、规范化。
2.配置库的分类
配置库也称配置项库,是配置管理的有力工具。在软件工程中,主要有4类配置库:
(1)开发库(动态库、程序员库、工作库)。存放开发过程中需要保留的各种信息(新模块、文档、数据元素或进行修改的已有元素等),供开发人员个人专用,是开发人员的工作区,由开发人员(工程师)控制。库中的信息可能有较为频繁的修改,只要开发库的使用者认为有必要,无需对其做任何限制。因为这通常不会影响到项目的其他部分。
(2)受控库(主库、系统库)。用于管理当前基线和控制对基线的变更。受控库包括配置单元和被提升并集成到配置项中的构件。软件工程师和其他人员可以自由地复制受控库中单元或构件。然而,必须有适当的权限授权变更。受控库中的单元或构件用于创建集成、系统和验收测试或对用户发布的构建版。在开发的某个阶段工作结束时,将工作产品存入或将有关的信息存入。
(3)产品库(静态库、软件仓库、软件产品库)。在开发的软件产品完成系统测试之后,作为最终产品存入库内,等待交付用户或现场安装。产品库用于存档各种广泛使用的已发布的基线,控制、保存和检索主媒介,库内的信息也应加以控制。
(4)备份库。用来存放配置项备份版本的库,包括制作软件和相关架构、数据和文档的不同版本的拷贝时的复制品。在各时点的备份,例如,可以每天、每周或每月执行备份。
3.配置库的建库模式
决定配置库的结构是配置管理活动的重要基础。一般常用的是两种组织形式:按配置项类型分类建库和按任务建库。
按配置项的类型分类建库的方式经常为一些咨询服务公司所推荐,它适用于通用的应用软件开发组织。这样的组织往往产品的继承性较强,工具比较统一,对并行开发有一定的需求。使用这样的库结构有利于对配置项的统一管理和控制,同时也能提高编译和发布的效率。但由于这样的库结构并不是面向各个开发团队的开发任务的,所以可能会造成开发人员的工作目录结构过于复杂,带来一些不必要的麻烦。
而按任务建立相应的配置库则适用于专业软件的研发组织。在这样的组织内,使用的开发工具种类繁多,开发模式以线性发展为主,所以就没有必要将配置项严格地分类存储,人为增加目录的复杂性。因此,对于研发性的软件组织来说,还是采用这种设置策略比较灵活。
几种典型的软件配置管理系统
1.面向过程的配置管理系统(CCC/HAVEST)
CCC/HAVEST是CA(Platinum)公司的产品,是一个基于团队开发的,提供以过程驱动为基础的,包含版本管理、过程控制等功能的配置管理工具。CCC/HAVEST中的CCC代表Configuration & Change Control,即配置变更控制。CCC/HAVEST可帮助用户在异构平台、远程分布,以及并行开发活动的情况下保持工作的协调和同步。不仅如此,它还可以有效跟踪复杂的企业级开发的各种变化(变更)的差异,从而使用户可以在预定的交付期限内提交高质量的软件版本。
CCC/HAVEST能确保开发团队开发出支持已定义和可重复过程的软件产品,使得开发产品遵循严格的标准、过程和策略:需求→编码→测试→生成产品。CCC/HAVEST确保只有经过批准的变化,以及所有必需的组件被提交到生产环境。变化以“包”的形式加分组,提供了非常好的可见性和可管理性。测试人员只能看到那些提交到测试环境中的“包”相关的变化。该产品已经被美国国防部、NASDAQ,Intel,AT&T,3COM等多家单位采用,成为大中型软件单位软件配置管理工具的首选产品之一。
2.版本控制工具——VSS
VSS(Visual Soureesafe)是微软公司开发的一个管理代码产品,它基于客户—服务器结构,在服务器端建立VSS的数据库,共享该数据库,客户端指定连接到该数据库,并且支持用户级管理,对中文的支持也比较全面。VSS使用反向增量技术,确保一个文档的所有版本是可用的。VSS使用不同的机制存储文本文件和二进制文件。在实际使用中,VSS提供了在网络应用系统开发中的文件共享和文件锁定特性,可确保团队开发中代码的完整性和一致性。它可以使开发人员对源代码和由Visual J ++,Visual Basic,Visual C ++和Visual Foxpro开发的部件进行管理,对软件版本开发进度进行管理和控制,并可以防止由于网络文件锁定导致的版本冲突。此外,VSS还可以与VisualInterDev紧密集成,管理动态Web应用系统中的各种部件,这样可以大大提高团队开发中进度管理的有效性。
3.配置管理工具——DSEE
配置管理工具(DSEE)由历史管理程序(History Manger)、配置管理程序(Configuration Manager)、任务管理程序(Task Manager)和监控管理程序(Monitor Manager)4个部分组成。历史管理程序负责在库中储藏管理配置项的各个版本;配置管理器的主要功能是定义和建立配置;而任务和监控程序则主要负责控制软件修改过程。
下面重点讨论配置管理部分。
使用DSEE建立一个配置需涉及以下3个概念。
①系统模型(System Model):它指出欲导出此配置项所需的源项、工具(DSEE中称为翻译器)和过程。
②配置依据(Configure Thread):它包括推导配置项版本时所用的一组规则、工具和工具中的选件(Options)。
③导出项缓冲池(Derived Element Pl):每一配置项建立后都放入缓冲池中,它可以同时存放某配置项的几个版本。因此,缓冲池中每项均附一个BCT(Bound Configuration Thread),它列出推导此配置项所用的各源项和工具版本及工具选件。
图2说明上述3个概念之间的关系,以及采用DSEE定义和建立一个配置项的过程。
DSEE首先根据“系统模型”和“配置依据”确定此次欲推导配置项的“BCT”,然后在缓冲池中查找那些可直接用于推导新配置项的配置项。正像一般Make工具,通过遍历项目依赖图,确定所有其所依赖的项在其建立之后从未改变过的项,直接使用它们,而不重新建立。如果在导出项缓冲池中能找到某个配置项,其BCT与欲推导配置项的BCT匹配,则DSEE立即重用它,不再重新推导。DSEE的一个优点就是允许各配置尽可能共享已经导出的配置项。
“系统模型”描述组成系统各分量之间的关系,即系统构成。系统模型包括每一个分量的形式(分为原子和聚合的),分量之间的依赖关系,以及每一个分量将被什么翻译器处理等。“配置依据”主要描述对于一次具体的配置建立,源项的哪些版本和翻译器的哪些选件将被使用。因此涉及版本和选件的命名与确定。为此,DSEE引入一套专用语言,描述“系统模型”的“配置依据”。
DSEE可以在网络环境下工作,此时建立配置的工作可在多个CPU上并行完成,图3说明并行建立机制,假设某用户在工作站A上要求DSEE建立某编译程序前端(指词法分析与语法分析部分),DSEE确定需要分别建立彼此独立的LEX.ASS和PARSER.C,选择结点B、C完成此项任务。这两个结点独立地从结点D的库中取所需源项,又将已建立完成的项目送到结点E的缓冲池中。
4.配置管理工具——PVCS
PVCS是美国Intersold公司的产品,是一个贯穿整个软件工程过程的面向开发团队的SCM系统。它适用于不同平台、多种对象类型。PVCS能够在Windows、Windows NT、DOS、OS/2和多种Unix平台上运行。可为开发对象通过通用的结构,包括源代码、目标代码、图形对象和文本文件。通过对文件夹、项目、平台的控制,得以实现标准化。
PVCS可成为软件开发中质量管理的核心,利用PVCS可进行变更管理、版本管理、建立管理,并进行问题跟踪。在局域网环境安装PVCS,还能进行文档管理,可监督、修正开发项目,可跟踪软件系统的修改。在什么地方修改的、什么时间修改的、如何修改的。任何时候都可重构系统。PVCS能够防止软件变更后的冲突、覆盖和错误,以保证软件的安全性。
PVCS软件由以下7个部分组成。①PVCS Version Manager:版本管理程序。版本控制系统管理并保护开发者的软件资源。它有直观的图形用户界面,可快速、简便地帮助初学者和专家访问所有项目的部件和开发对象。先进的安全管理机制可按用户、开发组和功能,授与许可和特权。用户通过登入(Check in)和检出(Check out)的方式访问服务器上的文件,未经授权的用户则无法访问服务器上的文件。每次登入时,在服务器上都会生成新的版本,PVCS对软件版本的管理采取增量存储的方式。任何版本都可以随时检出编辑,同一应用的不同版本可以像树枝一样增长。PVCS具有加锁功能,可在文件更新时保护文件,避免不同用户更改同一文件时发生冲突。一旦某一文件登入结束,锁即被解除,该文件可由其他用户使用。
②PVCS Tracker:跟踪程序。跟踪程序为开发组织成员提供有效的通信机制,使各成员之间能够方便地交流开发过程中的问题、软件的缺陷和变化,并对出现的问题进行跟踪和统计。跟踪程序内置专用的数据库用于存储成员之间相互交流的有关信息,并通过易于使用的图形界面、多风格的集成式报表和统计图形,以直观的形式为项目管理员提供用于软件工程项目管理的有用信息。
③PVCS Configuration Builder:配置建立程序。在客户—服务器软件开发环境中,对软件变更进行管理,可满足团队开发的需要。它提供了在比较、链接、编译的同时自动建立应用程序的能力,使客户—服务器软件系统的建立自动化,并在任何时候都能完整、精确地重建任一版本的用户系统。Configuration Builder能够和Version Manager很好地相互配合,并能从现有的Version Manager文档中摘录正确的开发对象版本,尤其在多操作系统上建立复杂版本的过程简单且不出错。
④PVCS Production Gateway:生产网关。生产网关实现多个远程软件开发管理系统间的同步,同时提供了与主机软件开发管理库之间的互联。使用Production Gateway开发人员能够在远程工作站或MVS宿主机上共享PVCS中的代码、设置客户—服务器环境和建立软件部件。
⑤PVCS Reporter:报表生成程序。这是专用于PVCS的报表生成工具,提供在Window界面中可定制的报告,能更好地管理开发过程。利用其高级数据生成和报表系统,可以通过灵活的图形界面快速地生成定制报表。
⑥PVCS Developer’s Toolkit:开发工具箱。选用PVCS Developer’s Toolkit,可开发一个包含PVCS功能的应用系统。软件开发人员利用PVCS可以集成完整的PVCS功能,简便地在应用程序中增加版本控制能力。PVCS Developer’s Toolkit提供DLL文件、可链接库和头文件。这些文件可以提供所有PVCS Version Manager和Configuration Builder功能的能力。开发工具箱为开发组成员提供应用程序编程接口(APl),以建立与PVCS的接口或直接继承PVCS的功能。
⑦PVCS Notify:通告程序。Notify是一种E-mail通知系统,是PVCS Tracker的补充。该系统能够把新发现的软件缺陷和重要的更新信息及时通知所有开发团队的成员,以及拥有E-mail系统的用户,团队开发依赖于开发组成员之间有效通信。问题报告和改动要求在开发者、测试者和管理人员之间传送,重要的改动必须通知有关人员。Tracker和Notify消除了通信瓶颈,加快问题的解决;通过内置的消息机制或电子邮件系统的所有权和状态更改,信息可安全传送。
5.Clearcase
Clearcase是Rational公司推出的软件配置工具,主要基于Windows和UNIX的开发环境,提供了包括版本控制、工作空间管理、建立管理和过程控制等比较全面的配置管理功能,而且无需软件开发人员改变现有的环境、工具和工作方式,给那些经常跨越复杂环境(如Windows和UNIX系统)进行复杂项目开发的团队带来巨大效益。此外,ClearCase也支持广泛的开发环境。ClearCase数据存储在一个可访问的版本对象库(Version Object base,VOB)中,ClearCase把所有版本控制的数据存放在一永久、安全的存储区中,即版本对象库中。项目团队(或管理者)可以决定其所需要的VOB数量,可以决定什么样的目录或文件需要被维护。ClearCase不仅可以对软件组件的版本进行维护和控制,也可对一个非文本文件、目录的版本进行维护。
Clearcase的先进功能直接解决了原来开发团队所面临的一些难以处理的问题,并且通过资源重用使开发的软件更加可靠。在当今日益激烈的竞争中,ClearCase作为规范的软件配置管理工具,满足了软件开发人员的大部分需求。
Linux C/C++源码实现常见命令mkdir
Linux系统的结构由文件和目录构成。在使用过程中,我们经常需要创建目录来存储各类文件。此时,我们会使用Linux系统的内置命令mkdir,该命令用于在操作系统中创建目录或文件夹。本文将探讨如何使用具有不同命令行选项的mkdir命令及其代码实现。
mkdir命令代码实现
在Linux系统中,虽然可以使用rm命令删除目录,但首先需要使用mkdir命令来创建目录。下面是mkdir命令的实现方法:
编译运行:
my_mkdir将创建一个名为path的新目录。新目录的文件权限位将从模式初始化,mode参数的这些文件权限位将由进程的文件创建掩码修改。
mkdir代码实现相对简单,主要用于在Linux操作系统中创建目录。通过代码实现创建目录后,我们可以使用选项来查看其效果。
创建多目录
当需要创建多个目录时,只需指定要创建的目录名称。需要注意的是,在创建多个目录时,需要在目录名称之间添加空格。以下是一个创建多个目录的示例命令:
./my_mkdir aaa bbb ccc
创建父目录
./my_mkdir a/b
上述命令将在目录a中创建名为b的目录。如果目录a不存在,则会显示错误信息。
如果父目录不存在,可以使用-p选项创建它。如果目录a不存在,mkdir命令将创建目录a,并在目录a内创建一个名为b的目录。
如何在详细模式下创建目录?
我们可以使用-v选项以详细模式创建新目录。当使用此选项创建新目录时,它将在屏幕中生成以下详细输出。
总结
通过代码实现mkdir命令,并结合各种命令行选项使用。本文展示了mkdir命令的简单性和易用性。
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çéªè¯ï¼å¯ä»¥å¾ç¥è·å¾çæ件æ¯å¦å®æ´ã
stfservice 源码分析
软件源码好吗_软件源码什么意思
彩票组合源码_彩票组合源码是什么
网站源码 带_网站源码带前后端
怎么封装源码_怎么封装源码系统
akmall源码下载