1、关于项目
一:MD5加密和DES加密的区别
咱们先来说说MD5加密好了:白话讲,就是一种算法,这个算法,把一个字符串、文件或者压缩包,进行MD5后,生成一个长度为128bits的串,而这个串可以认为是唯一的
如果有人修改过这个文件、或者压缩包,就会生成新的串,与原来的对比,你就知道被修改过了。
加密过的消息是完整的,是可逆向出来原数据的;但是加密过的摘要不是完整的,是不可逆向的。
MD5 之后的长度问题,肯定是128bits的0和1的串;但是可读性不行,所以改成十六进制,4位二进制表示1位十六进制,所以最后就是32位的十六进制数据。
对于为什么网上有16位的,,,是通过32位进行整理的(比如去除前8位后8位)
MD5(message-digest)是生成一段不可逆的字符串或者数值,以此来判断文件是否被修改,来保证文件的安全性和完整性。
总结下MD5的作用:一致性;数字签名;安全访问认证
最后:MD5没有逆向算法;在数据库中不能作为主键的,因为一个MD5加密后的串(值)可以对应多个原始数据
DES加密速度快,适合大量数据,但是DES容易破解,一般用3重DES。
实际操作过程中,数据量小,就用非对称加密算法;所以我们一般需要用非对称加密算法来加密对称加密算法的秘钥;然后再用对称加密算法加密大量的数据。
如果在选定了加密算法后,那采用多少位的密钥呢?
一般来说,密钥越长,运行的速度就越慢,应该根据的我们实际需要的安全级别来选择。
一般来说,RSA建议采用1024位的数字,ECC建议采用160位,AES采用128位即可。
二:移动端进行远程监控如何实现数据传输
三:用excel不用数据库的原因
(1)当时excel比较大众一些,(2)而且我们的数据量也不是很大,(3)当时还有数据处理用excel的公式更容易上手一些,(4)还有,数据库需要SQL等语言方便第三方调用。后边思考了一下,excel的局限性其实也蛮大的,最大的就是数据量的问题,一旦数据量有几十万,excel处理数据就捉襟见肘了。
2、关于基础
数据结构
一:容器的底层实现
简单的得知道吧
vector经常使用,是用数组来实现的,支持快速随机访问。
list也接触过,是用双向链表实现的,支持快速增删。
deque不常见,但是它是由一个中央控制器和多个缓冲区实现的。看起来是像list和vector组成。因为它支持头尾(中间不支持)快速增删,和快速随机访问。
set和map都是红黑树实现的(目前不清楚)
操作系统
一:进程线程的区别
直接总结吧(相应知识后边再继续介绍了解):
地址空间:同一进程的众多线程共享本进程的地址空间;而进程间具有相互独立的地址空间。
资源拥有:同一进程内资源为这个进程内所有线程公有,比如:cpu、io;但进程间的资源独立。
健壮性:一个进程崩溃,在保护模式下,其他进程基本不受影响;但是一个线程崩溃,整个进程都会死掉,所以,多进程要比多线程健壮。
进程切换消耗资源大,所以涉及到频繁的切换时,用线程比用进程好;同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程
执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
线程是处理器调度的基本单位,但是进程不是,是分配和管理资源的基本单位。
何时使用多进程,何时使用多线程?
对资源的管理和保护要求高,不限制开销和效率时,使用多进程。
要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。
(小白白可以观望下,大牛直接略过)
理解进程和线程概念:假如服务器同一时间内只能服务于一个客户端,其他客户端都再那里等待的话,可见其性能的低下,这估计会被客户骂死,因此并发编程应运而生。
并发是网络编程中必须考虑的问题。
实现并发的方式有多种:比如多进程、多线程、IO多路复用。
多进程:
进程是资源分配的基本单位,他是程序运行时的一个实例。
程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。
Linux系统函数fork()
可以在父进程中创建一个子进程,这样的话,在一个进程接到来自客户端新的请求时就可以复制出一个子进程让其来处理;父进程只需负责监控请求的到来,然后创建子进程让其去处理,这样就能做到并发处理。
fork函数会返回两次结果,因为操作系统会把当前进程的数据复制一遍,然后程序就分两个进程继续运行后面的代码,fork分别在父进程和子进程中返回,在子进程返回的值pid永远是0,在父进程返回的是子进程的进程id。
例子:
pid = os.fork() ==》两个进程,,,首先是子进程返回pid=0,,然后是父进程返回值pid=子进程号
if pid == 0:
print('子进程:%s,父进程是:%s' % (os.getpid(), os.getppid()))
else:
print('进程:%s 创建了子进程:%s' % (os.getpid(),pid ))
输出结果:进程:27223 创建了子进程:27224
子进程:27224,父进程是:27223
多线程:
线程是cpu调度和分派的基本单位。一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。
计算机网络
一:TCP安全传输的保证机制
(1)确认和重传:接收方接受到报文后会确认;发送方得不到确认会重新发送。
(2)数据校验
(3)数据合理分片和排序:TCP会按MTU合理分片,接收方会缓存未按序到达的数据,重新排序后再交给应用层。
(4)流量控制
(5)拥塞控制:当网络拥塞时,会减少数据的发送。
来说下实现:滑动窗口
为啥用滑动窗口?
当发送方发送0号报文,还没接受到确认,那么还想发送1-3号报文。想想后边可能还要重传,所以建立缓冲区维护已经发送的报文。
C++
一:什么时候析构函数使用虚函数
先说析构函数总写成虚函数是没问题的,(推荐)
基类指针指向子类对象,删除这个指针的时候需要析构两个对象,一个是基类的析构,一个是子类的析构。
所以必须把子类和父类的析构函数前(或者只在父类的析构前)加上virtual,,完成继承和多态。
二:设计一个空类,编译器自动生成的函数有哪些(6个)
声明时一个成员函数都不会生成,只会生成一个字节的占位符;需要的时候生成这6个成员:缺省构造函数,析构函数,拷贝构造函数,赋值操作符,取址操作符,this指针
定义时生成6个成员函数:缺省的构造函数,拷贝构造函数,赋值操作符,2个取址运算符,析构函数
数据库服务器这类的没有问。
3、编程
判断一个字符串是对称的。
#include <iostream> #include<windef.h> #include <string.h> using namespace std; bool CheckStr(char* str) { int l=0; int r=strlen(str)-1; while(l<r) { if(str[l]==str[r]) { l++; r--; } else break; } if(l==r || l==r+1) return true; else return false; } int main() { char a[]="abfdcba"; bool flag=CheckStr(a); //BOOL int cout<<flag<<endl; return 0; }