uCOS II

uCOS II
uCOS II

uCOS II简介

μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。

μC/OS-II 的前身是μC/OS,最早出自于1992 年美国嵌入式系统专家Jean https://www.360docs.net/doc/1611769082.html,brosse 在《嵌入式系统编程》杂志的5 月和6 月刊上刊登的文章连载,并把μC/OS 的源码发布在该杂志的B B S 上。

μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌人到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至 2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。

严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II 良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。

uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。

uC/OS-II以源代码的形式发布,但并不意味着它是开源软件。你可以将其用于教学和私下研究(peaceful research);但是如果你将其用于商业用途,那么你必须通过Micrium获得商用许可。

编辑本段任务管理

uC/OS-II 中最多可以支持64 个任务,分别对应优先级0~63,其中0 为最高优先级。63为最低级,系统保留了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。

uC/OS-II提供了任务管理的各种函数调用,包括创建任务,删除任务,改变任务的优先级,任务挂起和恢复等。

系统初始化时会自动产生两个任务:一个是空闲任务,它的优先级最低,该任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。

编辑本段时间管理

uC/OS-II的时间管理是通过定时中断来实现的,该定时中断一般为10毫秒或100毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。

uC/OS-II要求用户在定时中断的服务程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。

编辑本段内存管理

在ANSI C中是使用malloc和free两个函数来动态分配和释放内存。但在嵌入式实时系统中,多次这样的操作会导致内存碎片,且由于内存管理算法的原因,malloc和free的执行时间也是不确定。

uC/OS-II中把连续的大块内存按分区管理。每个分区中包含整数个大小相同的内存块,但不同分区之间的内存快大小可以不同。用户需要动态分配内存时,系统选择一个适当的分区,按块来分配内存。释放内存时将该块放回它以前所属的分区,这样能有效解决碎片问题,同时执行时间也是固定的。

编辑本段任务间通信与同步

对一个多任务的操作系统来说,任务间的通信和同步是必不可少的。uC/OS-II中提供了4种同步对象,分别是信号量,邮箱,消息队列和事件。所有这些同步对象都有创建,等待,发送,查询的接口用于实现进程间的通信和同步。

编辑本段任务调度

uC/OS-II 采用的是可剥夺型实时多任务内核。可剥夺型的实时内核在任何时候都运行就绪了的最高优先级的任务。

uC/os-II的任务调度是完全基于任务优先级的抢占式调度,也就是最高优先级的任务一旦处于就绪状态,则立即抢占正在运行的低优先级任务的处理器资源。为了简化系统设计,uC/OS-II规定所有任务的优先级不同,因为任务的优先级也同时唯一标志了该任务本身。

编辑本段任务调度将在以下情况下发生:

1)高优先级的任务因为需要某种临界资源,主动请求挂起,让出处理器,此时将调度就绪状态的低优先级任务获得执行,这种调度也称为任务级的上下文切换。

2)高优先级的任务因为时钟节拍到来,在时钟中断的处理程序中,内核发现高优先级任务获得了执行条件(如休眠的时钟到时),则在中断态直接切换到高优先级任务执行。这种调度也称为中断级的上下文切换。

这两种调度方式在uC/OS-II的执行过程中非常普遍,一般来说前者发生在系统服务中,后者发生在时钟中断的服务程序中。

调度工作的内容可以分为两部分:最高优先级任务的寻找和任务切换。其最高优先级任务的寻找是通过建立就绪任务表来实现的。u C / O S 中的每一个任务都有独立的堆栈空间,并有一个称为任务控制块TCB(Task Control Block)的数据结构,其中第一个成员变量就是保存的任务堆栈指针。任务调度模块首先用变量OSTCBHighRdy 记录当前最高级就绪任务的TCB 地址,然后调用OS_TASK_SW()函数来进行任务切换。

编辑本段μC/OS-II的组成部分

μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。

1) 核心部分(OSCore.c)

是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。

2) 任务处理部分(OSTask.c)

任务处理部分中的内容都是与任务的操作密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II是以任务为基本单位调度的,所以这部分内容也相当重要。

3) 时钟部分(OSTime.c)

μC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完成的。

4) 任务同步和通信部分

为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。

5) 与CPU的接口部分

是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU 的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。

编辑本段uC/OS-II的任务切换机理及中断调度优化

摘要:μC/OS-II是一种适用于嵌入式系统的抢占式实时多任务操作系统,开放源代码,便于学习和使用。介绍μC/OS-II在任务级和中断级的任务切换原理,以及这一操作系统基于嵌入式系统的对于中断的处理;相对于内存资源较少的单片机,着重讨论一种优化的实用堆栈格式和切换形式,以提高资源的利用率;结合MSP430单片机,做具体的分析。关键词:实时多任务操作系统μC/OS MSP430 中断堆栈

引言

在嵌入式操作系统领域,由Jean J. Labrosse开发的μC/OS,由于开放源代码和强大而稳定的功能,曾经一度在嵌入式系统领域引起强烈反响。而其本人也早已成为了嵌入式系统会议(美国)的顾问委员会的成员。

不管是对于初学者,还是有经验的工程师,μC/OS开放源代码的方式使其不但知其然,还知其所以然。通过对于系统内部结构的深入了解,能更加方便地进行开发和调试;并且在这种条件下,完全可以按照设计要求进行合理的裁减、扩充、配置和移植。通常,购买RTOS往往需要一大笔资金,使得一般的学习者望而却步;而μC/OS对于学校研究完全免费,只有在应用于盈利项目时才需要支付少量的版权费,特别适合一般使用者的学习、研究和开发。自1992第1版问世以来,已有成千上万的开发者把它成功地应用于各种系统,安全性和稳定性已经得到认证,现已经通过美国FAA 认证。

编辑本段1 μC/OS-II的几大组成部分

μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。

核心部分(OSCore.c) 是操作系统的处理核心,包括操作系统初始化、操作系统运行、中断进出的前导、时钟节拍、任务调度、事件处理等多部分。能够维持系统基本工作的部分都在这里。

任务处理部分(OSTask.c) 任务处理部分中的内容都是与任务的操作

密切相关的。包括任务的建立、删除、挂起、恢复等等。因为μC/OS-II

是以任务为基本单位调度的,所以这部分内容也相当重要。

时钟部分(OSTime.c) μC/OS-II中的最小时钟单位是timetick(时钟节拍)。任务延时等操作是在这里完成的。

任务同步和通信部分为事件处理部分,包括信号量、邮箱、邮箱队列、事件标志等部分;主要用于任务间的互相联系和对临界资源的访问。

与CPU的接口部分是指μC/OS-II针对所使用的CPU的移植部分。由于μC/OS-II是一个通用性的操作系统,所以对于关键问题上的实现,还是需要根据具体CPU的具体内容和要求作相应的移植。这部分内容由于牵涉到SP等系统指针,所以通常用汇编语言编写。主要包括中断级任务切换

的底层实现、任务级任务切换的底层实现、时钟节拍的产生和处理、中断的相关处理部分等内容。

编辑本段uC/OS II在S3C2410上的移植:

随着信息化技术的发展和数字化产品的普及,以计算机技术、芯片技术和软件技术为核心的嵌入式系统再度成为当前研究和应用的热点。

对功能、可靠性、成本、体积和功耗严格要求的嵌入式系统一般由嵌入式微处理器、外围硬件设备、嵌入式操作系统以及用户的应用程序等四个部分组成,其中嵌入式微处理器和嵌入式操作系统分别是其硬件和软件的核心。

ARM处理器由于其具有小体积、低功耗、低成本、高性能等特点,广泛应用在16/32位嵌入式RISC解决方案中,几乎占有嵌入式微处理器市场分额的75% ,本文选定三星公司生产的一款基于ARM920T核的高性能低功耗SOC芯片S3C2410作为移植方案的硬件平台。市场上主流的嵌入式实时操作系统有Vxworks、pSos、WinCE、Linux等,基于实时性、成本以及开发难度方面的考虑,我们选择uC/OS II——开放源代码的嵌入式实时操作系统。

编辑本段uC/OS II介绍

uC/OS II(Micro Control Operation System Two)是一个可以基于ROM 运行的、可裁减的、抢占式、实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和很多商业操作系统性能相当的实时操作系统(RTOS)。为了提供最好的移植性能,uC/OS II最大程度上使用ANSI C语言进行开发,并且已经移植到近40多种处理器体系上,涵盖了从8位到64位各种CPU(包括DSP)。

uC/OS II可以简单的视为一个多任务调度器,在这个任务调度器之上完善并添加了和多任务操作系统相关的系统服务,如信号量、邮箱等。其主要特点有公开源代码,代码结构清晰、明了,注释详尽,组织有条理,可移植性好,可裁剪,可固化。内核属于抢占式,最多可以管理60个任务。从1992年开始,由于高度可靠性、鲁棒性和安全性,uC/OS II已经广泛使用在从照相机到航空电子产品的各种应用中。

编辑本段2 uC/OS II在S3C2410上的可移植性

所谓移植,就是使这个实时内核能在某个微处理器上运行。为了方便移植,大部分的uC/OS II代码是用c语言写的,但仍需要用c和汇编语言写一些与处理器相关的代码,这是因为uC/OS II在读写处理器寄存器时只能通过汇编语言来实现。由于uC/OS II在设计时就已经充分考虑了可移植

性,所以uC/OS II的移植相对来说是比较容易的。uC/OS II的框架结构如图2。

uC/OSII的正常运行需要处理器平台满足以下要求:

a)处理器的C编译器能产生可重入代码。

b)用C语言就可以打开和关闭中断。

c)处理器支持中断,并且能产生定时中断(通常在10至100Hz之间)。

d)处理器支持能够容纳一定量数据(可能是几千字节)的硬件堆栈。

e)处理器有将堆栈指针和其它CPU寄存器读出和存储到堆栈或内存中的指令。

S3C2410处理器采用ARM920T内核,内部共有37个寄存器,其中R13通常用作堆栈指针,只要系统RAM空间允许,堆栈空间理论上没有限制。ARM处理器提供ARM指令和Thumb指令两种指令集,每种指令集都包含有丰富的指令对堆栈进行操作,可以随意的对处理器中的寄存器进行堆栈操作。根据堆栈生长方向的不同,可以生成4种不同的堆栈,分别是满递增、空递增、满递减(此移植中使用的是满递减方式)、空递减。芯片内集成5个定时时钟,任何一个都可以产生定时中断,满足第三条要求。ADS集成开发环境的内置编译器可以产生可重入代码,并且支持内嵌汇编,C环境中可任意的进行开关中断操作。综上所述uC/OS II完全可以移植到S3C2410上运行。

3 主体移植过程

3.1 设置与处理器及编译器相关的代码[OS_CPU.H]

不同的编译器会使用不同的字节长度来表示同一数据类型,所以要定义一系列数据类型以确保移植的正确性。下面是uC/OS II定义的一部分数据类型。

typedef unsigned char BOOLEAN;

typedef unsigned char INT8U;/*无符号8位*/

typedef signed char INT8S;/*带符号8位*/

typedef unsigned int INT16U;/*无符号16位*/

typedef signed int INT16S;/*带符号16位*/

typedef unsigned long INT32U;/*无符号32位数*/

typedef signed long INT32S;/*带符号32位数*/

typedef float FP32;/*单精度浮点数*/

typedef double FP64;/*双精度浮点数*/

typedef unsigned int OS_STK;/*堆栈入口宽度*/

typedef unsigned int OS_CPU_SR;/*寄存器宽度*/

uC/OS II需要先关中断再访问临界区的代码,并且在访问完后重新允许中断。uC/OS II定义了两个宏来禁止和允许中断:OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL(),本移植实现这两个宏的汇编代码。

#define OS_ENTER_CRITICAL()(cpu_sr=OSCPUSaveSR())/*Disable interrupts*/

#define OS_EXIT_CRITICAL()(OSCPURestoreSR(cpu_sr))/*Enable interrupts*/

EXPORT OSCPUSaveSR

OSCPUSaveSR

mrs r1,cpsr

mov r0,r1

orr r1,r1,#0xc0

msr cpsr_cxsf,r1

mov pc,lr

EXPORT OSCPURestoreSR

OSCPURestoreSR

msr cpsr_cxsf,r0

mov pc,lr

3.2 用C语言实现与处理器任务相关的函数[OS_CPU_C.C]

OSTaskStkInit()

OSTaskCreateHook()

OSTaskDelHook()

OSTaskSwHook()

OSTaskStatHook()

OSTimeTickHook()

实际需要修改的只有OSTaskStkInit()函数,其他五个函数需要声明,但不一定有实际内容。这五个函数都是用户定义的,所以OS_CPU_C.C中没有给出代码。如果需要使用这些函数,可以将文件OS_CFG.H中的#define constant OS_CPU_HOOKS_EN设为1,设为0表示不使用这些函数。

OSTaskStkInit()函数由OSTaskCreate()或OSTaskCreateExt()调用,需要传递的参数是任务代码的起始地址、参数指针(pdata)、任务堆栈顶端的地址和任务的优先级,用来初始化任务的堆栈,初始状态的堆栈模拟发生一次中断后的堆栈结构。堆栈初始化工作结束后,OSTaskStkInit()返回新的堆栈栈顶指针,OSTaskCreate()或OSTaskCreateExt()将指针保存在任务的OS_TCB中。调用OSTaskStkInit()给任务做一个初始的任务上下文堆栈,形状如图3。

3.3 处理器相关部分汇编实现

整个uC/OS II移植实现中,只需要提供一个汇编语言文件,提供几个必须由汇编才能实现的函数。

a)OSStartHighRdy()

该函数在OSStart()多任务启动之后,负责从最高优先级任务的TCB控制块中获得该任务的堆栈指针sp,通过sp依次将CPU现场恢复,此时系统就将控制权交给用户创建的该任务的进程,直到该任务被阻塞或者被其他更高优先级的任务抢占了CPU。该函数仅仅在多任务启动时被执行一次,用来启动第一个,也就是最高优先级的任务执行。

b)OSCtxSw()

该函数是任务级的上下文切换函数,在任务因为被阻塞而主动请求与CPU调度时执行,主要工作是先将当前任务的CPU现场保存到该任务堆栈中,然后获得最高优先级任务的堆栈指针,从该堆栈中恢复此任务的CPU现场,使之继续执行,从而完成一次任务切换。

C)OSIntExit()

该函数是中断级的任务切换函数,在时钟中断ISR中发现有高优先级任务在等待时,需要在中断退出后不返回被中断的任务,而是直接调度就绪的高优先级任务执行。其目的在于能够尽快让高优先级的任务得到响应,保证系统的实时性能。

d)OSTickISR()

该函数是时钟中断处理函数,主要任务是负责处理时钟中断,调用系统实现的OSTimeTick函数,如果有等待时钟信号的高优先级任务,则需要在中断级别上调度其执行。另外两个相关函数是OSIntEnter()和

OSIntExit(),都需要在ISR中执行。

编辑本段4 测试

至此代码移植过程已经完成,下一步工作就是测试。测试一个象uC/OS II一样的多任务实时内核并不复杂,甚至可以在没有应用程序的情况下测试。换句话说,就是让这个实时内核在目标板上跑起来,让内核自己测试自己。这样做有两个好处:第一,避免使本来就复杂的事情更加复杂;第二,如果出现问题,可以知道问题出在内核代码上而不是应用程序。刚开始的时候可以运行一些简单的任务和时钟节拍中断服务例程。一旦多任务调度成功地运行了,再添加应用程序的任务就是非常简单的工作了。

编辑本段5 结束语

采用基于ARM9的S3C2410嵌入式微处理器,可以使系统具备高性能的运算能力的同时便于与各种外设连接扩展,简化了硬件设计,维持小型化的同时降低了系统成本。uC/OS II作为一个源代码公开的操作系统,在具体应用中稳定可靠,并且支持uIP TCP/IP协议栈、ucGUI等,可扩展性强,功能强大。本系统采ARM9+uC/OS II开发设计,具有精度高、运行稳定、

实时性好、抗干扰能力强、性价比高的特点,可以在各种工业场合中广泛应用,达到了设计的初衷

μC/OS-II作为一个嵌入式实时操作系统,自1992年以来,因其源代码的完全公开和优越性能,已为众多的爱好者和开发人员所了解并得到了广泛应用。μC/OS-II是一个占先式内核,执行时间可确定(即函数的调用与服务的时间是可知的,不依赖于应用程序的大小),目前最多支持64个任务(8个为系统保留),总是执行处于就绪态的优先级最高的任务。目前,51系列及其扩展型单片机仍在单片机应用系统占较大比重,因而详细介绍μC/OS-II在AT89C51上的移植实现过程,解决移植过程中出现的问题,有很大的实用意义。

ucosII任务切换是怎样实现的

UC/OS-II学习笔记之——任务切换是怎样实现的问题是, o Uc/OS-II如何切换任务?通过任务调度器OS_Sched(),那么谁在调用这个函数? o CPU在这里肯定有作用,因为任务切换必然涉及到CPU寄存器的入栈和出栈, 那么这一块工作是如何完成的? 书上讲:为了做到任务切换,运行OS_TASK_SW(),人为模仿一次中断。中断服务子程序或陷阱处理(trap hardler),也称作事故处理(exception handler),必须给汇编语言函数OSCtxSw()提供中断向量[1.92]。 那么,“人为模仿一次中断”是什么意思? 是指:OS_TASK_SW()触发了一个中断,由中断完成了任务切换? 阅读源代码,查找答案…… #define OS_TASK_SW()OSCtxSw()//这是一个宏调用,定义在os_cpu.h,Os_cpu_a.asm中定义了OSCtxSw NVIC_INT_CTRL EQU0xE000ED04 NVIC_PENDSVSET EQU0x10000000 ;****************************************************************************** ;PERFORM A CONTEXT SWITCH(From task level) ;void OSCtxSw(void) ; ;Note(s):1)OSCtxSw()is called when OS wants to perform a task context switch.This function ;triggers the PendSV exception which is where the real work is done. ;****************************************************************************** OSCtxSw LDR R0,=NVIC_INT_CTRL;Trigger the PendSV exception(causes context switch) LDR R1,=NVIC_PENDSVSET STR R1,[R0] BX LR 注释说明该段汇编代码触发了一个PendSV的异常。

什么是哈希函数

什么是哈希函数 哈希(Hash)函数在中文中有很多译名,有些人根据Hash的英文原意译为“散列函数”或“杂凑函数”,有些人干脆把它音译为“哈希函数”,还有些人根据Hash函数的功能译为“压缩函数”、“消息摘要函数”、“指纹函数”、“单向散列函数”等等。 1、Hash算法是把任意长度的输入数据经过算法压缩,输出一个尺寸小了很多的固定长度的数据,即哈希值。哈希值也称为输入数据的数字指纹(Digital Fingerprint)或消息摘要(Message Digest)等。Hash函数具备以下的性质: 2、给定输入数据,很容易计算出它的哈希值; 3、反过来,给定哈希值,倒推出输入数据则很难,计算上不可行。这就是哈希函数的单向性,在技术上称为抗原像攻击性; 4、给定哈希值,想要找出能够产生同样的哈希值的两个不同的输入数据,(这种情况称为碰撞,Collision),这很难,计算上不可行,在技术上称为抗碰撞攻击性; 5、哈希值不表达任何关于输入数据的信息。 哈希函数在实际中有多种应用,在信息安全领域中更受到重视。从哈希函数的特性,我们不难想象,我们可以在某些场合下,让哈希值来“代表”信息本身。例如,检验哈希值是否发生改变,借以判断信息本身是否发生了改变。` 怎样构建数字签名 好了,有了Hash函数,我们可以来构建真正实用的数字签名了。 发信者在发信前使用哈希算法求出待发信息的数字摘要,然后用私钥对这个数字摘要,而不是待发信息本身,进行加密而形成一段信息,这段信息称为数字签名。发信时将这个数字签名信息附在待发信息后面,一起发送过去。收信者收到信息后,一方面用发信者的公钥对数字签名解密,得到一个摘要H;另一方面把收到的信息本身用哈希算法求出另一个摘要H’,再把H和H’相比较,看看两者是否相同。根据哈希函数的特性,我们可以让简短的摘要来“代表”信息本身,如果两个摘要H和H’完全符合,证明信息是完整的;如果不符合,就说明信息被人篡改了。 数字签名也可以用在非通信,即离线的场合,同样具有以上功能和特性。 由于摘要一般只有128位或160位比特,比信息本身要短许多倍,USB Key或IC卡中的微处理器对摘要进行加密就变得很容易,数字签名的过程一般在一秒钟内即可完成。

数据库常用函数汇总统计

实验二(续):利用SQL语句查询 三、常用库函数及统计汇总查询 1、求学号为 S1学生的总分和平均分; select sum(score) as TotalScore,avg(score)as AveScore from sc where sno='S1' 2、求选修 C1号课程的最高分、最低分及之间相差的分数; select max(score)as MaxScore, min(score)as MinScore, max(score)- min(score)as diff from sc where cno='C1' 3、求选修 C1号课程的学生人数和最高分; select count(distinct sno),max(score) from sc where cno='C 1' 4、求计算机系学生的总数; select count(sno) from s where dept=' 计算机 ' 5、求学校中共有多少个系; select count(distinct dept) as DeptNum from s 6、统计有成绩同学的人数; select count(score) from sc 7、利用特殊函数 COUNT(*)求计算机系学生的总数; select count(*) from s where dept=' 计算机 '

8、利用特殊函数 COUNT(*)求女学生总数和平均年龄;select count(*),avg(age) from s where sex=' 女 ' 9、利用特殊函数 COUNT(*)求计算机系女教师的总数。select count(*) from t where dept=' 计算机 'and sex=' 女 ' 四、分组查询及排序 1、查询各个教师的教师号及其任课门数; select tno,count(*)as c_num from tc group by tno 2、按系统计女教师的人数; select dept,count(tno) from t where sex=' 女 ' group by dept 3、查询选修两门以上课程的学生的学号和选课门数;select sno,count(*)as sc_num from sc group by sno having count(*)>2 4、查询平均成绩大于 70分的课程号和平均成绩; select cno,avg(score) from sc group by cno having avg(score)>70 5、查询选修 C1的学生学号和成绩,并按成绩降序排列;select sno,score

最小完美哈希函数(深入搜索引擎)

最小完美哈希函数 哈希函数h是一个能够将n个键值x j的集合映射到一个整数集合的函数h(x i),其值域范围是0≤h(x j)≤m-l,允许重复。哈希是一个具有查找表功能并且提供平均情况下快速访问的标准方法。例如,当数 据包含n个整数键值。某常用哈希函数采用h(x)=x mod m,其中m 是一个较小的值,且满足m>n/a。a是装载因子,表示记录数和可用地址数的比例关系。m一般选择一个素数,因此如果要求提供一个对1000个整数键值进行哈希的函数,一个程序员可能会建议写出如下函数形式:,h(x)=x mod 1399。并且提供一个装载因子为。a=0.7的表,该表声明能够存放1399个地址。 a越小,两个不同键值在相同哈希值相互冲突的可能性就越小,然而冲突总是不可避免。第1次考虑这个问题时,事实可能让人吃惊,最好的例子莫过于著名的生日悖论(birthday paradox)。假定一年有365天,那么要组合多少个人,才能使得出现生日相同的人这一概率超过0.5呢?换句话说,给定一个365个哈希槽(hashslot)。随机选择多少个键值才能够使得出现冲突的概率超过0.5?当首次面对这样一个问题时,一般的反应肯定是认为需要很多人才行。事实上,答案是只需区区23人。找到一个能够满足现实大小要求且无冲突的哈希函数的几率小到几乎可以忽略25。例如,一个1000个键值和1399个随机选择的槽,完全没有冲突的概率为 2.35×10-217(概率的计算诱导公式将在下一节中给出,以公式4.1代入m=1399和n=1000得到),如何才能最好地处理这些不可避免冲突?这一话题将在本节中以大段篇幅展开,这里我们正是要找到其中万里挑一的能够避免所有冲突的哈 希函数。 25可以试图在一群人中做这样一个有趣的实验,笔者曾在讲述哈希表的课上和同学们做 过多次这样的实验。有一项很重要的事情往往被我们忽略,即参加者必须事先在纸上写下他们的生日(或者其他任意日子)。然后才能开始核对的工作,这样才能消除神奇的负反馈。在我们的实验中,除非这样做了,否则也许必须找到366个同学才能遇到第1次碰撞,也许这乜存在心理学悖论吧。

哈 希 常 见 算 法 及 原 理

数据结构与算法-基础算法篇-哈希算法 1. 哈希算法 如何防止数据库中的用户信息被脱库? 你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗? 在实际开发中,我们应该如何用哈希算法解决问题? 1. 什么是哈希算法? 将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 2. 如何设计一个优秀的哈希算法? 单向哈希: 从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。 篡改无效: 对输入敏感,哪怕原始数据只修改一个Bit,最后得到的哈希值也大不相同。 散列冲突: 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小。 执行效率: 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速计算哈

希值。 2. 哈希算法的常见应用有哪些? 7个常见应用:安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储。 1. 安全加密 常用于加密的哈希算法: MD5:MD5 Message-Digest Algorithm,MD5消息摘要算法 SHA:Secure Hash Algorithm,安全散列算法 DES:Data Encryption Standard,数据加密标准 AES:Advanced Encryption Standard,高级加密标准 对用于加密的哈希算法,有两点格外重要,第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要小。 在实际开发中要权衡破解难度和计算时间来决定究竟使用哪种加密算法。 2. 唯一标识 通过哈希算法计算出数据的唯一标识,从而用于高效检索数据。 3. 数据校验 利用哈希算法对输入数据敏感的特点,可以对数据取哈希值,从而高效校验数据是否被篡改过。 4. 散列函数 1.如何防止数据库中的用户信息被脱库?你会如何存储用户密码这么重要的数据吗?

uCOS-II任务堆栈检验(OSTaskStkChk())

uC/OS-II任务堆栈检验(OSTaskStkChk()) 使用OSTaskStkChk()可以返回一个记录所检查堆栈空间的使用情况,包括已使用空间及 空闲空间的大小。但只有用OSTaskCreateExt()建立的任务的堆栈才正常使用OSTaskStkChk()。这个堆栈检验功能的原理很简单,因为OSTaskCreateExt()已经把任务堆栈 每个字节初始为0了,所以只需要从栈底依次扫描每个字节并计数直到当一个字节的内容不 为0,也即从这个字节起的空间已经至少被任务使用过了,得到的计数就是空闲空间的大小,使用空间的大小由栈的总大小减去空闲空间的大小就可以得到。 OSTaskStkChk(INT8U prio,OS_STK_DATA *pdata) /*检查优先级为prio的任务的堆栈使用情况,并把结果存入OS_STK_DATA类型的单元中*/ INT8U OSTaskStkChk(INT8U prio,OS_STK_DATA *pdata) { OS_TCB *ptcb; /*用于执行所要堆栈检测任务的TCB*/ OS_STK *pchk; /*用于指向所要堆栈检测的任务的堆栈*/ INT32U free; /*存放未使用的堆栈容量*/ INT32U size; /*存放堆栈总容量*/ pdata->OSFree=0; /*将用于存放堆栈检测结果的单元进行清零*/ pdata->OSUsed=0; if(prio>OS_LOWEST_PRIO &&prio != OS_PRIO_SELF)/*查看优先级是否在有效范围内*/ { return(OS_PRIO_INVALID); } OS_ENTER_CRITICAL();/*在对任务的TCB内容读取的过程中需要关中断,即TCB是临界资源,不可多个进程同时访问*/ if (prio==OS_PRIO_SELF) /*如果prio的值为OS_PRIO_SELF 即prio==0xFF,系统规定优 先级为当前正在执行的任务*/ { prio=OSTCBCur->OSTCBPrio;/*需要将prio的值更改为当前正在执行任务的优先级*/ } ptcb=OSTCBPrioTbl[prio];/*根据任务的优先级和TCB优先级表,找到所要进程堆栈检测 任务的TCB*/

哈 希 常 见 算 法 及 原 理

计算与数据结构篇 - 哈希算法 (Hash) 计算与数据结构篇 - 哈希算法 (Hash) 哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 构成哈希算法的条件: 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同; 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小; 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。 哈希算法的应用(上篇) 安全加密 说到哈希算法的应用,最先想到的应该就是安全加密。最常用于加密的哈希算法是 MD5(MD5 Message-Digest Algorithm,MD5 消息摘要算法)和 SHA(Secure Hash Algorithm,安全散列算法)。 除了这两个之外,当然还有很多其他加密算法,比如 DES(Data Encryption Standard,数据加密标准)、AES(Advanced Encryption Standard,高级加密标准)。

前面我讲到的哈希算法四点要求,对用于加密的哈希算法来说,有两点格外重要。第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要很小。 不过,即便哈希算法存在散列冲突的情况,但是因为哈希值的范围很大,冲突的概率极低,所以相对来说还是很难破解的。像 MD5,有 2^128 个不同的哈希值,这个数据已经是一个天文数字了,所以散列冲突的概率要小于 1-2^128。 如果我们拿到一个 MD5 哈希值,希望通过毫无规律的穷举的方法,找到跟这个 MD5 值相同的另一个数据,那耗费的时间应该是个天文数字。所以,即便哈希算法存在冲突,但是在有限的时间和资-源下,哈希算法还是被很难破解的。 对于加密知识点的补充,md5这个算法固然安全可靠,但网络上也有针对MD5中出现的彩虹表,最常见的思路是在密码后面添加一组盐码(salt), 比如可以使用md5(1234567.'2019@STARK-%$#-idje-789'),2019@STARK-%$#-idje-789 作为盐码起到了一定的保护和安全的作用。 唯一标识(uuid) 我们可以给每一个图片取一个唯一标识,或者说信息摘要。比如,我们可以从图片的二进制码串开头取 100 个字节,从中间取 100 个字节,从最后再取 100 个字节,然后将这 300 个字节放到一块,通过哈希算法(比如 MD5),得到一个哈希字符串,用它作为图片的唯一标识。通过这个唯一标识来判定图片是否在图库中,这样就可以减少很多工作量。

常用函数大全

常用函数大全 mysql_affected_rows
mysql_affected_rows — 取得前一次 MySQL 操作所影响的记录行数 mysql_fetch_array —从结果集中取得一行作为关联数组或数字数组或二者兼 有:
mysql_fetch_array($result, MYSQL_NUM) , MYSQL_NUM 可用 MYSQL_BOTH 或
MYSQL_ASSOC 代替,也可以不写,默认为 MYSQL_BOTH
mysql_fetch_row — 从结果集中取得一行作为枚举数组: mysql_fetch_row($result); mysql_fetch_assoc($result)
mysql_fetch_row()从和指定的结果标识关联的结果集中取得一行数据并作为数组返回。每个结果 的列储存在一个数组的单元中,偏移量从 0 开始。 依次调用 mysql_fetch_row()将返回结果集中的下一行,如果没有更多行则返回 FALSE。 mysql_fetch_assoc — 从结果集中取得一行作为关联数组 :
mysql_fetch_assoc() 和用 mysql_fetch_array() 加上第二个可选参数 MYSQL_ASSOC 完全相同。它 仅仅返回关联数组。这也是 mysql_fetch_array()起初始的工作方式。如果在关联索引之外还需要数字 索引,用 mysql_fetch_array()。 如果结果中的两个或以上的列具有相同字段名,最后一列将优先。要访问同名的其它列,要么用 mysql_fetch_row()来取得数字索引或给该列起个别名。参见 mysql_fetch_array() 例子中有关别名说 明。 有一点很重要必须指出,用 mysql_fetch_assoc()并不明显 比用 mysql_fetch_row()慢,而且还提供了 明显更多的值。
mysql_query()
仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,
如果查询执行不正确则返回 FALSE。对于其它类型的 SQL 语句,mysql_query()在执行成功时返回 TRUE,出错时返回 FALSE。非 FALSE 的返回值意味着查询是合法的并能够被服务器执行。这并不说明 任何有关影响到的或返回的行数。 很有可能一条查询执行成功了但并未影响到或并未返回任何行。

ucos-ii操作系统复习大纲

ucos-ii操作系统复习大纲 一.填空题 1.uC/OS-II是一个简洁、易用的基于优先级的嵌入式【抢占式】多任务实时内核。 2.任务是一个无返回的无穷循环。uc/os-ii总是运行进入就绪状态的【最高优先级】的任务。 3.因为uc/os-ii总是运行进入就绪状态的最高优先级的任务。所以,确定哪 个任务优先级最高,下面该哪个任务运行,这个工作就是由【调度器(scheduler)】来完成的。 4.【任务级】的调度是由函数OSSched()完成的,而【中断级】的调度 是由函数OSIntExt() 完成。对于OSSched(),它内部调用的是【OS_TASK_SW()】完成实际的调度;OSIntExt()内部调用的是【 OSCtxSw() 】实现调度。 5.任务切换其实很简单,由如下2步完成: (1)将被挂起任务的处理器寄存器推入自己的【任务堆栈】。 (2)然后将进入就绪状态的最高优先级的任务的寄存器值从堆栈中恢复到【寄存器】中。 6.任务的5种状态。 【睡眠态(task dormat) 】:任务驻留于程序空间(rom或ram)中,暂时没交给ucos-ii处理。 【就绪态(task ready)】:任务一旦建立,这个任务就进入了就绪态。 【运行态(task running)】:调用OSStart()可以启动多任务。OSStart()函数只能调用一次,一旦调用,系统将运行进入就绪态并且优先级最高的任务。 【等待状态(task waiting)】:正在运行的任务,通过延迟函数或pend(挂起)相关函数后,将进入等待状态。

【中断状态(ISR running)】:正在运行的任务是可以被中断的,除非该任务将中断关闭或者ucos-ii将中断关闭。 7.【不可剥夺型】内核要求每个任务自我放弃CPU的所有权。不可剥夺型调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。 8.当系统响应时间很重要时,要使用【可剥夺型】内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。 9.使用可剥夺型内核时,应用程序不应直接使用不可重入型函数。调用不可重入型函数时,要满足互斥条件,这一点可以用【互斥型信号量】来实现。 10.【可重入型】函数可以被一个以上的任务调用,而不必担心数据的破坏。 11.可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数或者只使用【局部变量】,即变量保存在CPU寄存器中或堆栈中。如果使用全局变量,则要对全局变量予以【保护】。 12.每个任务都有其优先级。任务越重要,赋予的优先级应【越高】。 13.μC/OS-Ⅱ初始化是通过调用系统函数【OSIint()】实现的,完成μC/OS-Ⅱ所有的变量和数据结构的初始化。 14.多任务的启动是用户通过调用【OSStart()】实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用【任务】。 15. μC/OS-Ⅱ的参数配置文件名为【】。 16.删除任务,是说任务将返回并处于【休眠状态】,并不是说任务的代码被删除了,只是任务的代码不再被μC/OS-Ⅱ调用。 17.μC/OS-Ⅱ要求用户提供【定时中断】来实现延时与超时控制等功能。 18.定时中断也叫做【时钟节拍】,它应该每秒发生10至100次。 19. 时钟节拍的实际频率是由用户的应用程序决定的。时钟节拍的频率越高,系统的负荷就【越重】。 20.μC/OS-II中的信号量由两部分组成:一个是信号量的【计数值】,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的【等待任务表】。用户要在中将OS_SEM_EN开关量常数置成【1 】,这样μC/OS-II 才能支持信号量。 21. μC/OS-II中表示当前已经创建的任务数全局变量名为:【 OSTaskCtr 】。

哈希的基本概念

6、8 哈希表及其查找★3◎4 哈希译自“hash"一词,也称为散列或杂凑。?哈希表查找得基本思想就是:根据当前待查找数据得特征,以记录关键字为自变量,设计一个哈希函数,依该函数按关键码计算元素得存储位置,并按此存放;查找时,由同一个函数对给定值key计算地址,将key与地址单元中元素关键码进行比较,确定查找就是否成功。哈希方法中使用得转换函数称为哈希函数(杂凑函数),按这个思想构造得表称为哈希表(杂凑表)。?对于n个数据元素得集合,总能找到关键码与存放地址一一对应得函数、若最大关键为m,可以分配m个数据元素存放单元,选取函数f(ke y)=key即可,但这样会造成存储空间得很大浪费,甚至不可能分配这么大得存储空间、通常关键码得集合比哈希地址集合大得多,因而经过哈希函数变换后,可能将不同得关键码映射到同一个哈希地址上,这种现象称为冲突(Collisio n)。映射到同一哈希地址上得关键码称为同义词。可以说,冲突不可能避免,只能尽可能减少。所以,哈希方法需要解决以下两个问题:?(1)构造好得哈希函数?①所选函数尽可能简单,以便提高转换速度。?②所选函数对关键码计算出得地址,应在哈希地址集中大致均匀分布,以减少空间浪费。 (2)制定解决冲突得方案 1.常用得哈希函数 (1)直接定址法 即取关键码得某个线性函数值为哈希地址,这类函数就是一一对应函数,不会产生冲突,但要求地址集合与关键码集合大小相同,因此,对于较大得关键码集合不适用。如关键码集合为{100,300,500,700,800,900},选取哈希函数为Ha

sh(key)=key/100,则存放如表6-3所示。 表6—3 直接定址法构造哈希表 (2)除留余数法 即取关键码除以p得余数作为哈希地址。使用除留余数法,选取合适得p很重要,若哈希表表长为m,则要求p≤m,且接近m或等于m。p一般选取质数,也可以就是不包含小于20质因子得合数、?(3)数字分析法 设关键码集合中,每个关键码均由m位组成,每位上可能有r种不同得符号、?数字分析法根据r种不同得符号及在各位上得分布情况,选取某几位,组合成哈希地址。所选得位应就是各种符号在该位上出现得频率大致相同。 (4)平方取中法?对关键码平方后,按哈希表大小,取中间得若干位作为哈希地址。?(5)折叠法(Folding)?此方法将关键码自左到右分成位数相等得几部分,最后一部分位数可以短些,然后将这几部分叠加求与,并按哈希表表长,取后几位作为哈希地址。这种方法称为折叠法。?有两种叠加方法:?①移位法-—将各部分得最后一位对齐相加。 ②间界叠加法—-从一端向另一端沿各部分分界来回折叠后,最后一位对齐相加。?如对关键码为key=25346358705,设哈希表长为3位数,则可对关键码每3位一部分来分割。关键码分割为如下4组: 253 463 58705 分别用上述方法计算哈希地址如图6—12所示、对于位数很多得关键码,且每一位上符号分布较均匀时,可采用此方法求得哈希地址。

c++常用函数大全

数学函数,所在函数库为math.h、stdlib.h、string.h、float.h int abs(int i) 返回整型参数i的绝对值 double cabs(struct complex znum) 返回复数znum的绝对值 double fabs(double x) 返回双精度参数x的绝对值 long labs(long n) 返回长整型参数n的绝对值 double exp(double x) 返回指数函数ex的值 double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中double ldexp(double value,int exp); 返回value*2exp的值 double log(double x) 返回logex的值 double log10(double x) 返回log10x的值 double pow(double x,double y) 返回xy的值 double pow10(int p) 返回10p的值 double sqrt(double x) 返回+√x的值 double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度 double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度 double atan(double x) 返回x的反正切tan-1(x)值,x为弧度 double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度double cos(double x) 返回x的余弦cos(x)值,x为弧度 double sin(double x) 返回x的正弦sin(x)值,x为弧度 double tan(double x) 返回x的正切tan(x)值,x为弧度 double cosh(double x) 返回x的双曲余弦cosh(x)值,x为弧度 double sinh(double x) 返回x的双曲正弦sinh(x)值,x为弧度 double tanh(double x) 返回x的双曲正切tanh(x)值,x为弧度 double hypot(double x,double y) 返回直角三角形斜边的长度(z), x和y为直角边的长度,z2=x2+y2 double ceil(double x) 返回不小于x的最小整数 double floor(double x) 返回不大于x的最大整数 void srand(unsigned seed) 初始化随机数发生器 int rand() 产生一个随机数并返回这个数 double poly(double x,int n,double c[])从参数产生一个多项式 double modf(double value,double *iptr)将双精度数value分解成尾数和阶 double fmod(double x,double y) 返回x/y的余数 double frexp(double value,int *eptr) 将双精度数value分成尾数和阶 double atof(char *nptr) 将字符串nptr转换成浮点数并返回这个浮点数 double atoi(char *nptr) 将字符串nptr转换成整数并返回这个整数 double atol(char *nptr) 将字符串nptr转换成长整数并返回这个整数 char *ecvt(double value,int ndigit,int *decpt,int *sign) 将浮点数value转换成字符串并返回该字符串

实验二 UCOS-II任务管理

班级学号姓名同组人 实验日期室温大气压成绩 实验二 UCOS-II任务管理 一、实验目的 1、掌握UCOS-II中任务管理的函数的应用。 2、掌握UCOS-II在STM32平台下对硬件的控制。 3、掌握开发UCOS-II应用的程序结构。 二、实验步骤 1、UCOSII工作原理 UCOSII提供系统时钟节拍,实现任务切换和任务延时等功能。这个时钟节拍由 OS_TICKS_PER_SEC(在os_cfg.h中定义)设置,一般我们设置UCOSII的系统时钟节拍为1ms~100ms。本次实验利用STM32的SYSTICK定时器来提供UCOSII时钟节拍。 UCOSII的任何任务都是通过一个叫任务控制块(TCB)的东西来控制的,每个任务管理块有3个最重要的参数:(1)任务函数指针;(2)任务堆栈指针;(3)任务优先级。 在UCOSII中,使用CPU的时候,优先级高(数值小)的任务比优先级低的任务具有优先使用权,即任务就绪表中总是优先级最高的任务获得CPU使用权,只有高优先级的任务让出CPU使用权(比如延时)时,低优先级的任务才能获得CPU使用权。UCOSII不支持多个任务优先级相同,也就是每个任务的优先级必须不一样。任务的调度其实就是CPU 运行环境的切换,即:PC指针、SP指针和寄存器组等内容的存取过程 UCOSII的每个任务都是一个死循环。每个任务都处在以下5种状态之一的状态下,这5种状态是:睡眠状态、就绪状态、运行状态、等待状态(等待某一事件发生)和中断服务状态。 睡眠状态,任务在没有被配备任务控制块或被剥夺了任务控制块时的状态。

就绪状态,系统为任务配备了任务控制块且在任务就绪表中进行了就绪登记,任务已经准备好了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时不能运行,这时任务的状态叫做就绪状态。 运行状态,该任务获得CPU使用权,并正在运行中,此时的任务状态叫做运行状态等待状态,正在运行的任务,需要等待一段时间或需要等待一个事件发生再运行时,该任务就会把CPU的使用权让给别的任务而使任务进入等待状态。 中断服务状态,一个正在运行的任务一旦响应中断申请就会中止运行而去执行中断服务程序,这时任务的状态叫做中断服务状态。 UCOSII任务的5个状态转换关系如图所示: 与任务相关的几个函数: 1)建立任务函数 UCOSII提供了我们2个建立任务的函数:OSTaskCreat和OSTaskCreatExt,我们一般用OSTaskCreat函数来创建任务,该函数原型为: OSTaskCreate(void(*task)(void*pd),void*pdata,OS_STK*ptos,INTU prio) 该函数包括4个参数: task:是指向任务代码的指针; pdata:是任务开始执行时,传递给任务的参数的指针; ptos:是分配给任务的堆栈的栈顶指针; prio是分配给任务的优先级。 每个任务都有自己的堆栈,堆栈必须申明为OS_STK类型,并且由连续的内存空间组成。可以静态分配堆栈空间,也可以动态分配堆栈空间。OSTaskCreatExt也可以用来创

哈 希 常 见 算 法 及 原 理 ( 2 0 2 0 )

哈希算法乱谈(摘自知乎) 最近【现场实战追-女孩教-学】初步了解了Hash算法的相关知识,一些人的见解让我能够迅速的了解相对不熟悉的知识,故想摘录下来,【QQ】供以后温故而知新。 HASH【⒈】算法是密码学的基础,比较常用的有MD5和SHA,最重要的两【О】条性质,就是不可逆和无冲突。 所谓不【1】可逆,就是当你知道x的HASH值,无法求出x; 所谓无【б】冲突,就是当你知道x,无法求出一个y,使x与y的HA【9】SH值相同。 这两条性【⒌】质在数学上都是不成立的。因为一个函数必然可逆,且【2】由于HASH函数的值域有限,理论上会有无穷多个不同的原始值【6】,它们的hash值都相同。MD5和SHA做到的,是求逆和求冲突在计算上不可能,也就是正向计算很容易,而反向计算即使穷尽人类所有的计算资-源都做不到。 顺便说一下,王小云教授曾经成功制造出MD5的碰撞,即md5(a) = md5(b)。这样的碰撞只能随机生成,并不能根据一个已知的a求出b(即并没有破坏MD5的无冲突特性)。但这已经让他声名大噪了。 HASH算法的另外一个很广泛的用途,就是很多程序员都会使用的在数据库中保存用户密码的算法,通常不会直接保存用户密码(这样DBA就能看到用户密码啦,好危险啊),而是保存密码的HASH值,验

证的时候,用相同的HASH函数计算用户输入的密码得到计算HASH值然后比对数据库中存储的HASH值是否一致,从而完成验证。由于用户的密码的一样的可能性是很高的,防止DBA猜测用户密码,我们还会用一种俗称“撒盐”的过程,就是计算密码的HASH值之前,把密码和另外一个会比较发散的数据拼接,通常我们会用用户创建时间的毫秒部分。这样计算的HASH值不大会都是一样的,会很发散。最后,作为一个老程序员,我会把用户的HASH值保存好,然后把我自己密码的HASH值保存到数据库里面,然后用我自己的密码和其他用户的用户名去登录,然后再改回来解决我看不到用户密码而又要“偷窥”用户的需要。最大的好处是,数据库泄露后,得到用户数据库的黑客看着一大堆HASH值会翻白眼。 哈希算法又称为摘要算法,它可以将任意数据通过一个函数转换成长度固定的数据串(通常用16进制的字符串表示),函数与数据串之间形成一一映射的关系。 举个粒子,我写了一篇小说,摘要是一个string:'关于甲状腺精灵的奇妙冒险',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了我的文章,并发表为'关于JOJO的奇妙冒险',我可以立即发现我的文章被篡改过,因为根据'关于JOJO的奇妙冒险'计算出的摘要不同于原始文章的摘要。 可见,摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡

Excel常用的函数计算公式大全

E x c e l常用的函数计算公 式大全 Prepared on 22 November 2020

EXCEL的常用计算公式大全 一、单组数据加减乘除运算: ①单组数据求加和公式:=(A1+B1) 举例:单元格A1:B1区域依次输入了数据10和5,计算:在C1中输入=A1+B1后点击键盘“Enter(确定)”键后,该单元格就自动显示10与5的和 15。 ②单组数据求减差公式:=(A1-B1) 举例:在C1中输入=A1-B1即求10与5的差值5,电脑操作方法同上; ③单组数据求乘法公式:=(A1*B1) 举例:在C1中输入=A1*B1即求10与5的积值50,电脑操作方法同上; ④单组数据求乘法公式:=(A1/B1) 举例:在C1中输入=A1/B1即求10与5的商值2,电脑操作方法同上; ⑤其它应用: 在D1中输入=A1^3即求5的立方(三次方); 在E1中输入=B1^(1/3)即求10的立方根 小结:在单元格输入的含等号的运算式,Excel中称之为公式,都是数学里面的基本运算,只不过在计算机上有的运算符号发生了改变——“×”与“*”同、“÷”与“/”同、“^”与“乘方”相同,开方作为乘方的逆运算,把乘方中和指数使用成分数就成了数的开方运算。这些符号是按住电脑键盘“Shift”键同时按住键盘第二排相对应的数字符号即可显示。如果同一列的其它单元格都需利用刚才的公式计算,只需要先用鼠标左键点击一下刚才已做好公式的单元格,将鼠标移至该单元格的右下角,带出现十字符号提示时,开始按住鼠标左键不动一直沿着该单元格依次往下拉到你需要的某行同一列的单元格下即可,即可完成公司自动复制,自动计算。 二、多组数据加减乘除运算: ①多组数据求加和公式:(常用) 举例说明:=SUM(A1:A10),表示同一列纵向从A1到A10的所有数据相加; =SUM(A1:J1),表示不同列横向从A1到J1的所有第一行数据相加; ②多组数据求乘积公式:(较常用) 举例说明:=PRODUCT(A1:J1)表示不同列从A1到J1的所有第一行数据相乘; =PRODUCT(A1:A10)表示同列从A1到A10的所有的该列数据相乘; ③多组数据求相减公式:(很少用) 举例说明:=A1-SUM(A2:A10)表示同一列纵向从A1到A10的所有该列数据相减; =A1-SUM(B1:J1)表示不同列横向从A1到J1的所有第一行数据相减; ④多组数据求除商公式:(极少用)

HASH表

hashing定义了一种将字符组成的字符串转换为固定长度(一般是更短长度)的数值或索引值 的方法,称为散列法,也叫哈希法。由于通过更短的哈希值比用原始值进行数据库搜索更快,这种方法一般用来在数据库中建立索引并进行搜索,同时还用在各种解密算法中。 设所有可能出现的关键字集合记为u(简称全集)。实际发生(即实际存储)的关键字集合记为k(|k|比|u|小得多)。|k|是集合k中元素的个数。 散列方法是使用函数hash将u映射到表t[0..m-1]的下标上(m=o(|u|))。这样以u中关键字为自变量,以h为函数的运算结果就是相应结点的存储地址。从而达到在o(1)时间内就可完成查找。 其中: ①hash:u→{0,1,2,…,m-1} ,通常称h为散列函数(hash function)。散列函数h 的作用是压缩待处理的下标范围,使待处理的|u|个值减少到m个值,从而降低空间开销。 ②t为散列表(hash table)。 ③hash(ki)(ki∈u)是关键字为ki结点存储地址(亦称散列值或散列地址)。 ④将结点按其关键字的散列地址存储到散列表中的过程称为散列(hashing). 比如:有一组数据包括用户名字、电话、住址等,为了快速的检索,我们可以利用名字作为关键码,hash规则就是把名字中每一个字的拼音的第一个字母拿出来,把该字母在26个字母中的顺序值取出来加在一块作为改记录的地址。比如张三,就是z+s=26+19=45。就是把张三存在地址为45处。 但是这样存在一个问题,比如假如有个用户名字叫做:周四,那么计算它的地址时也是z+s=45,这样它与张三就有相同的地址,这就是冲突,也叫作碰撞! 冲突:两个不同的关键字,由于散列函数值相同,因而被映射到同一表位置上。该现象称为冲突(collision)或碰撞。发生冲突的两个关键字称为该散列函数的同义词(synonym)。 冲突基本上不可避免的,除非数据很少,我们只能采取措施尽量避免冲突,或者寻找解决冲突的办法。影响冲突的因素 冲突的频繁程度除了与h相关外,还与表的填满程度相关。 设m和n分别表示表长和表中填人的结点数,则将α=n/m定义为散列表的装填因子(load factor)。α越大,表越满,冲突的机会也越大。通常取α≤1。 散列函数的构造方法: 1、散列函数的选择有两条标准:简单和均匀。 简单指散列函数的计算简单快速; 均匀指对于关键字集合中的任一关键字,散列函数能以等概率将其映射到表空间的任何一个位置上。也就是说,散列函数能将子集k随机均匀地分布在表的地址集{0,1,…,m-1}上,以使冲突最小化。 2、常用散列函数 (1)直接定址法:比如在一个0~100岁的年龄统计表,我们就可以把年龄作为地址。 (2)平方取中法

Excel常用的函数计算公式大全(一看就会)

计算机等级考试 =公式名称(参数1,参数2,。。。。。) =sum(计算范围) =average(计算范围) =sumifs(求和范围,条件范围1,符合条件1,条件范围2,符合条件2,。。。。。。) =vlookup(翻译对象,到哪里翻译,显示哪一种,精确匹配) =rank(对谁排名,在哪个范围里排名) =max(范围) =min(范围) =index(列范围,数字) =match(查询对象,范围,0) =mid(要截取的对象,从第几个开始,截取几个) =int(数字) =weekday(日期,2) =if(谁符合什么条件,符合条件显示的内容,不符合条件显示的内容) =if(谁符合什么条件,符合条件显示的内容,if(谁符合什么条件,符合条件显 示的内容,不符合条件显示的内容)) EXCEL的常用计算公式大全 一、单组数据加减乘除运算: ①单组数据求加和公式:=(A1+B1) 举例:单元格A1:B1区域依次输入了数据10和5,计算:在C1中输入=A1+B1 后点击键盘“Enter(确定)”键后,该单元格就自动显示10与5的和15。 ②单组数据求减差公式:=(A1-B1) 举例:在C1中输入=A1-B1 即求10与5的差值5,电脑操作方法同上; ③单组数据求乘法公式:=(A1*B1) 举例:在C1中输入=A1*B1 即求10与5的积值50,电脑操作方法同上; ④单组数据求乘法公式:=(A1/B1) 举例:在C1中输入=A1/B1 即求10与5的商值2,电脑操作方法同上; ⑤其它应用: 在D1中输入=A1^3 即求5的立方(三次方); 在E1中输入=B1^(1/3)即求10的立方根 小结:在单元格输入的含等号的运算式,Excel 中称之为公式,都是数学里面的基本 与 运算,只不过在计算机上有的运算符号发生了改变——“×” 与“* ”同、“÷” “/ ”同、“^”与“乘方”相同,开方作为乘方的逆运算,把乘方中和指数使用成分数 就成了数的开方运算。这些符号是按住电脑键盘“Shift ”键同时按住键盘第二排 相对应的数字符号即可显示。如果同一列的其它单元格都需利用刚才的公式计算,只 需要先用鼠标左键点击一下刚才已做好公式的单元格,将鼠标移至该单元格的右下 角,带出现十字符号提示时,开始按住鼠标左键不动一直沿着该单元格依次往下拉到 你需要的某行同一列的单元格下即可,即可完成公司自动复制,自动计算。

相关文档
最新文档