精华内容
下载资源
问答
  • 如果两个关键字的值不等但哈希函数值相等,则称这两个关键字为同义词。( ) 正确答案: A 你的答案: B (错误) 正确 错误 解答: 散列函数:一个把查找表中关键字映射成该关键字对应的地址的函数,记为Hash(key)=Addr...

    题一:
    如果两个关键字的值不等但哈希函数值相等,则称这两个关键字为同义词。( )
    正确答案: A 你的答案: B (错误)
    正确
    错误
    解答:
    散列函数:一个把查找表中关键字映射成该关键字对应的地址的函数,记为Hash(key)=Addr。(这里的地址可以是数组下标、索引、或内存地址等)
    散列函数可能会把两个或两个以上的不同关键字映射到同一地址,称这种情况为“冲突”,这些发生碰撞的不同关键字称为同义词。
    题二:
    int c[4][5],( *pc)[5];
    pc=c;
    那么,下列对数组C的元素引用正确的是( )。
    正确答案: D 你的答案: A (错误)
    pc+1

    • (pc+3)
    • (pc+1) +3
    • (*pc+2)
    • 解答:
    • pc是一个数组指针(指向数组的指针),指向列数为5的二维数组,pc = c,表示pc指向二维数组的第一行,pc+1偏移一行,一行5个元素。*pc得到二维数组c的第一行数组的首地址,+2偏移到c[0][2]的地址,解引用就得到数据2。c[4][5]可以理解为4个长度为5的一位数组,这四个一维数组的地址要用数组指针存放。
    • 题三:

    以下代码在64位的机子上输出是什么:

    #include <stdio.h>
    int getSize(int data[]){
    return sizeof(data);
    }
    int main(){
    int data1[] = {1,2,3,4,5};
    int size1 = sizeof(data1);
    int* data2 = data1;
    int size2 = sizeof(data2);
    int size3 = getSize(data1);
    printf("%d, %d, %d", size1, size2, size3);
    return 0;
    }
    正确答案: A 你的答案: A (正确)
    20,8, 8
    4, 4, 4
    20, 4, 20
    20, 20, 20
    解答:
    64位系统:int型占4个字节,指针占8个字节。
    data1[]数组大小是5,则4 * 5 = 20个字节;
    data2指针,即8个字节;
    数组名data1作为函数getSize()的参数会退化成指针,即8个字节。
    题四:
    下列叙述中正确的是?
    正确答案: A 你的答案: B (错误)
    线性表是线性结构;
    栈与队列是非线性结构;
    线性链表是非线性结构;
    二叉树是线性结构
    解答:
    线性结构:元素之间呈一对一的对应关系,其特点是每一个元素都有直接前驱和后继(除第一个和最后一个)
    包含顺序存储(元素连续)和链式存储(元素不一定 连续)两种存储结构
    常见的线性结构:线性表、栈、队列、串、数组
    常见的非线性结构:广义表、树、图
    题五:
    在一般系统中,设float x[8];假设数组x开始于内存1000单元,则x[2]的存储始于( )

    正确答案: D 你的答案: C (错误)
    1002
    1004
    1006
    1008
    解答:
    一般系统float类型占4 字节。
    x[2]中间间隔两个元素即2*4=8字节转换成十六进制为8,所以1000+8=1008
    题六:
    若一棵二叉树的前序遍历序列为a, e, b, d, c,后序遍历序列为b, c, d, e, a,则根结点的孩子结点()。

    正确答案: A 你的答案: D (错误)
    只有e
    有e、b
    有e、c
    无法确定
    解答:
    前序序列和后序序列不能唯一确定一棵二叉树,但可以确定二叉树中结点的祖先关系:当两个结点的前序序列为XY与后序序列为YX时,则X为Y的祖先。考虑前序序列a,e,b,d,c、后序序列b,c,d,e,a,可知a为根结点,e为a的孩子结点;此外,a的孩子结点的前序序列e,b,d,c、后序序列b,c,d,e,可知e是bcd的祖先,故根结点的孩子结点只有e。故选A。

    【排除法】显然a为根结点,且确定e为a的孩子结点,排除D。各种遍历算法中左右子树的遍历次序是固定的,若b也为a的孩子结点,则在前序序列和后序序列中e、b的相对次序应是不变的,故排除B,同理排除C。

    【特殊法】前序序列和后序序列对应着多棵不同的二叉树树形,我们只需画出满足该条件的任一棵二叉树即可,任意一棵二叉树必定满足正确选项的要求。
    在这里插入图片描述
    显然选A,最终得到的二叉树满足题设中前序序列和后序序列的要求。
    题七:
    void main() {
    char str[]=“S\065AB”;
    printf("\n%d", sizeof(str));
    }
    正确答案: C 你的答案: B (错误)
    7
    6
    5
    error
    解答:
    C ,这题考的真是很细啊… 转义字符\ddd表示8进制, 是一个数 ,所以就有 4个字符 + ‘\0’ 即5
    题八:

    展开全文
  • MD5得到的是一个16字节的哈希值(或称散列值),每个字节格式化位16进制(0x**),取数值部分的两个字符,连起来得到一个32个字符的字符串。这就是所说的32位MD5值。16位MD5值就是取的32位MD5值的中间段,即第9至24位...

    说明

    测试平台系统:Ubuntu18.04 X86_64
    测试语言:C++11
    测试编译器:GCC version 7.5.0
    测试内容:字符串和文件的MD5哈希值计算方法

    一、MD5简介

    关于16位和32位MD5值:
          MD5得到的是一个16字节的哈希值(或称散列值),每个字节格式化位16进制(0x**),取数值部分的两个字符,连起来得到一个32个字符的字符串。这就是所说的32位MD5值。16位MD5值就是取的32位MD5值的中间段,即第9至24位(如果从0开始作为第一位,则是第8至23位)。

    二、OpenSSL计算MD5介绍

          OpenSSL计算MD5分为两种方式:

    1. 非连续缓冲区的字符串计算:当有大量的数据块(比如文件)需要计算其MD5值时,使用此方法

    涉及的OpenSSL函数:

    int MD5_Init(MD5_CTX *c);
    int MD5_Update(MD5_CTX *c, const void *data, size_t len);
    int MD5_Final(unsigned char *md, MD5_CTX *c);

    计算方法:
    首先调用MD5_Init初始化,然后多次调用MD5_Update只至所有数据处理完毕,最后调用MD5_Final函数从其第一个参数得到最终16字节的md5哈希值,最终转换为16进制后得到32位MD5字符串。

     

    2. 连续缓冲区的字符串计算:当只有一个字符串需要计算其MD5值时,使用此方法

    涉及的OpenSSL函数:

    unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md);

    计算方法:
    直接调用此函数即可得到字符串对应的MD5哈希值,然后转换为16进制即可得到32位MD5字符串。其实此函数也是调用了“MD_Init/MD5_Update/MD5_Final”这三个函数实现。

     

    三、OpenSSL开发库安装

    sudo apt-get install libssl-dev       # Debian / Ubuntu系统下libssl即openssl库

    补充:

    在基于 Redhat / Fedora 的系统上安装这些软件包方法

    sudo dnf install openssl-devel

     

    四、借助C++11实现基于OpenSSL库的MD5计算

    Utils.cpp

    #include <openssl/evp.h>
    #include <openssl/hmac.h>
    #include <openssl/md5.h>
    #ifdef OPENSSL_IS_BORINGSSL 
    #include <openssl/base64.h>
    #endif
    #include <algorithm>
    #include <cstring>
    #include <sstream>
    #include <iomanip>
    #include "Utils.h"
    
    std::string CUtils::ComputeContentMD5(const std::string& data, EMD5Len md5len) 
    {
        return ComputeContentMD5(data.c_str(), data.size(), md5len);
    }
    
    std::string CUtils::ComputeContentMD5(const char * data, size_t size, EMD5Len md5len)
    {
        if (!data) {
            return "";
        }
    
        unsigned char md[MD5_DIGEST_LENGTH];
        MD5(reinterpret_cast<const unsigned char*>(data), size, (unsigned char*)&md);
    
        std::string strMD5 = HexToString(md, MD5_DIGEST_LENGTH);
        if(EMD5Len::Len16 == md5len)
        {
            return strMD5.substr(8, 16);
        }
    
        return strMD5;
    }
    
    std::string CUtils::ComputeContentMD5(std::istream& stream, EMD5Len md5len) 
    {
        auto ctx = EVP_MD_CTX_create();
    
        unsigned char md_value[EVP_MAX_MD_SIZE];
        unsigned int md_len = 0;
    
        EVP_MD_CTX_init(ctx);
    #ifndef OPENSSL_IS_BORINGSSL 
        EVP_MD_CTX_set_flags(ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
    #endif
        EVP_DigestInit_ex(ctx, EVP_md5(), nullptr);
    
        auto currentPos = stream.tellg();
        if (currentPos == static_cast<std::streampos>(-1)) {
            currentPos = 0;
            stream.clear();
        }
        stream.seekg(0, stream.beg);
    
        char streamBuffer[2048];
        while (stream.good())
        {
            stream.read(streamBuffer, 2048);
            auto bytesRead = stream.gcount();
    
            if (bytesRead > 0)
            {
                EVP_DigestUpdate(ctx, streamBuffer, static_cast<size_t>(bytesRead));
            }
        }
    
        EVP_DigestFinal_ex(ctx, md_value, &md_len);
        EVP_MD_CTX_destroy(ctx);
        stream.clear();
        stream.seekg(currentPos, stream.beg);
    
        std::string strMD5 = HexToString(md_value, md_len);
        if(EMD5Len::Len16 == md5len)
        {
            return strMD5.substr(8, 16);
        }
    
        return strMD5;
    }
    
    std::string CUtils::HexToString(const unsigned char *data, size_t size)
    { 
        static char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        std::stringstream ss;
        for (size_t i = 0; i < size; i++)
            ss << hex[(data[i] >> 4)] << hex[(data[i] & 0x0F)];
        return ss.str();
    }

    Utils.h

    class CUtils
    {
        enum class EMD5Len
        {
            Len32,
            Len16,
        };
    
        #define UNUSED_PARAM(x) ((void)(x))
    
    public:
        std::string ComputeContentMD5(const std::string& data, EMD5Len md5len = EMD5Len::Len32);
        std::string ComputeContentMD5(const char *data, size_t size, EMD5Len md5len = EMD5Len::Len32);
        std::string ComputeContentMD5(std::istream & stream, EMD5Len md5len = EMD5Len::Len32); 
        std::string HexToString(const unsigned char *data, size_t size);
    };

    main.cpp

    #include <string>
    #include <iostream>
    #include <fstream>
    #include <memory>
    #include <openssl/md5.h>
    #include "Utils.h"
    
    
    int main()
    {
        std::cout << MD5_DIGEST_LENGTH << std::endl;
        std::cout << CUtils::ComputeContentMD5("hello hello heelo", CUtils::EMD5Len::Len32) << std::endl;
        std::cout << CUtils::ComputeContentMD5("hello hello heelo", CUtils::EMD5Len::Len16) << std::endl;
    
        std::string filePath = "/home/dog/Dev/C++/utils/Url.h";
        std::shared_ptr<std::iostream> content = std::make_shared<std::fstream>(filePath, std::ios::in | std::ios::binary);  // 读取文件内容
        std::cout << CUtils::ComputeContentMD5(*content, CUtils::EMD5Len::Len32) << std::endl;
        std::cout << CUtils::ComputeContentMD5(*content, CUtils::EMD5Len::Len16) << std::endl;
    
        return 0;
    }

    Build: 

    $ g++ -std=c++11 -o main main.cpp Utils.cpp -I./ -lcrypto

    Run:

     

    参考

    1. 在线计算MD5:http://www.metools.info/other/o21.html
    2. OpenSSL计算MD5:https://www.cnblogs.com/binchen-china/p/5653337.html
                                          https://blog.csdn.net/weixin_34162401/article/details/93024139

    展开全文
  • python求文件哈希

    千次阅读 2019-03-06 16:31:29
    import os,sys,hashlib _FILE_SLIM=(100*1024*1024) def file_md5(filename): calltimes=0 hmd5=hashlib.md5() fp=open(filename,'rb') f_size=os.stat(filename).st_size if f_size&gt;...
    import os,sys,hashlib
    _FILE_SLIM=(100*1024*1024)
    def file_md5(filename):
        calltimes=0
        hmd5=hashlib.md5()
        fp=open(filename,'rb')
        f_size=os.stat(filename).st_size
        if f_size>_FILE_SLIM:
            while (f_size>_FILE_SLIM):
                hmd5.update(fp.read(_FILE_SLIM))
                f_size/=_FILE_SLIM
                calltimes+=1
            if (f_size>0 ) and (f_size<_FILE_SLIM):
                hmd5.update(fp.read())
        hmd5.update(fp.read())
    
        return (hmd5.hexdigest(),calltimes)
    if  __name__ == "__main__":
        if len(sys.argv)==2:
            filepath=os.path.abspath(sys.argv[1])
            (hvalue,ctimes)=file_md5(filepath)
            print(hvalue)
    
    展开全文
  • Python3计算获取文件、字符MD5、sha256、sha512、sha384、sha224、sha1,不多说,直接上代码。 方便调用 import os import hashlib # 使用python3.8及以上可以用此方法,写法更简洁。 def file_hash(file_path: str...

    Python3计算获取文件、字符MD5、sha256、sha512、sha384、sha224、sha1,不多说,直接上代码。

    方便调用

    import os
    import hashlib
    
    # 使用python3.8及以上可以用此方法,写法更简洁。
    def file_hash(file_path: str, hash_method) -> str:
        if not os.path.isfile(file_path):
            print('文件不存在。')
            return ''
        h = hash_method()
        with open(file_path, 'rb') as f:
            while b := f.read(8192):
                h.update(b)
        return h.hexdigest()
    
    # 其它python3版本使用此方法
    '''
    def file_hash(file_path: str, hash_method) -> str:
        if not os.path.isfile(file_path):
            print('文件不存在。')
            return ''
        h = hash_method()
        with open(file_path, 'rb') as f:
            while True:
                b = f.read(8192)
                if not b:
                    break	
                h.update(b)
        return h.hexdigest()
    '''
    
    def str_hash(content: str, hash_method, encoding: str = 'UTF-8') -> str:
        return hash_method(content.encode(encoding)).hexdigest()
    
    
    def file_md5(file_path: str) -> str:
        return file_hash(file_path, hashlib.md5)
    
    
    def file_sha256(file_path: str) -> str:
        return file_hash(file_path, hashlib.sha256)
    
    
    def file_sha512(file_path: str) -> str:
        return file_hash(file_path, hashlib.sha512)
    
    
    def file_sha384(file_path: str) -> str:
        return file_hash(file_path, hashlib.sha384)
    
    
    def file_sha1(file_path: str) -> str:
        return file_hash(file_path, hashlib.sha1)
    
    
    def file_sha224(file_path: str) -> str:
        return file_hash(file_path, hashlib.sha224)
    
    
    def str_md5(content: str, encoding: str = 'UTF-8') -> str:
        return str_hash(content, hashlib.md5, encoding)
    
    
    def str_sha256(content: str, encoding: str = 'UTF-8') -> str:
        return str_hash(content, hashlib.sha256, encoding)
    
    
    def str_sha512(content: str, encoding: str = 'UTF-8') -> str:
        return str_hash(content, hashlib.sha512, encoding)
    
    
    def str_sha384(content: str, encoding: str = 'UTF-8') -> str:
        return str_hash(content, hashlib.sha384, encoding)
    
    
    def str_sha1(content: str, encoding: str = 'UTF-8') -> str:
        return str_hash(content, hashlib.sha1, encoding)
    
    
    def str_sha224(content: str, encoding: str = 'UTF-8') -> str:
        return str_hash(content, hashlib.sha224, encoding)
     
    

    使用方法:

    获取文件md5

    file_md5(r'D:\xxx\xxx')
    

    计算字符md5(默认编码为utf-8)

    str_md5('666')
    

    使用其它编码计算字符md5

    str_md5('666', encoding='gbk')
    
    展开全文
  • 哈希冲突:多个关键字公用一个地址。 哈希函数的构造方法: 直接定址法 数字分析法 平方取中法 除留余数法 解决哈希冲突的方法 开放地址法-线性探查法 容易产生堆积,即存储太多时,没地方放。 链地址法 ...
  • 在这种情况下,除了希望函数值的分布比较均匀外,还应设法解决“地址冲突”的问题。 例如: N = 17,Hash( SYM ) 为 SYM / N 的余数时,由于Hash( ‘05’ ) = Hash( ‘22’) = 5,此时便存在地址冲突。 符号表将Hash...
  • 答案:c 问的是至少需要多少次探测,即我们假设在上一次探测的基础上,每进行一次二次探测都能直接找到对应的位置。 第一个:直接找到位置,入坑,1次; 第二个:和第一个同hash,找到的位置被第一个给占了,通过二...
  • Lintcode 128. 哈希函数 题解1.题目1.解法一:按照提给直接...一种广泛使用的哈希函数算法是使用数值33,假设任何字符串都是基于33的一个大整数,比如: hashcode(“abcd”) = (ascii(a) * 333 + ascii(b) * 332 + as
  • 哈希函数

    万次阅读 多人点赞 2018-03-01 08:12:14
    什么是 HashHash(哈希),又称“散列”。散列(hash)英文原意是“混杂”、“拼凑”、“重新表述”的意思。在某种程度上,散列是与排序相反的一种操作,排序是将集合中的元素按照某种方式比如字典顺序排列在一起,...
  • 已知某个哈希表的n个关键字具有相同的哈希值,如果使用二次探测再散列法将这n个关键字存入哈希表, 至少要进行____次探测。 插入: 第一个元素 探测1次 第二个元素 探测2次 第三个元素 探测3次 。。。。。。 第N...
  • # hash_code.upper() 字符串转大写 return hash_code.upper() print(get_md5_01(file_path)) 运行结果: 大写: 小写: python计算hashcode值 python中的hash() 用于获取取一个对象(字符串或者数值等)的哈希值 ...
  • 全面理解哈希函数及其应用

    千次阅读 2021-06-09 20:41:08
    哈希函数是指一种能够讲任意数据转换为固定长度编码的一种函数,因为不同数据得到的哈希值可能相同,因此哈希过程一般是不可逆的,哈希函数可以应用的密码加密,哈希存储等方面。 好的哈西函数应该具备以下特点: ...
  • 哈希表简介 ▶定义:根据设定的哈希函数和处理冲突的方法将一组关键字映像到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置。 比如要建立一张学生名单的表 C[40], C[i] ...
  • Python哈希值的相关方法均包含在hashlib库中。hashlib库提供生成哈希值的基础方法,对于一般用途应该足够了。当然也可以进行自定义,在hashlib提供的方法的基础上,编写一些特殊需求的代码模块module。 在hashlib库...
  • 已知某个哈希表的n个关键字具有相同的哈希值,如果使用二次探测再散列法将这n个关键字存入哈希表,至少要进行____次探测。 解析:假设在上一次探测的基础上,每进行一次二次探测都能直接找到对应的位置。 第一个:...
  • 主要介绍了Python实现通过文件路径获取文件hash值的方法,结合实例形式分析了Python针对文件进行hash运算的实现方法与相关注意事项,需要的朋友可以参考下
  • 哈希算法

    万次阅读 多人点赞 2019-01-21 14:51:16
    对于哈希算法,在我们平时的开发中,都是基本上拿来就用就行了,所以这节我们将重点放在如何使用,并不进行哈希算法的原理剖析和如何设计一个哈希算法的讲解. 什么是哈希算法? 将任意长度的二进制值串映射为固定...
  • 认识一下31这个神奇的数, 31是一个奇素数(即是奇数又是素数) 31 * i 可以写成(i << 5)- i (JVM可以把31 * i ...哈希表类似数组一样,根据索引去存放值,添加、搜索、删除的都可以达到O(1)的级别,索引的计...
  • 简单的哈希函数求值

    2018-02-09 22:22:51
    今天晚上的程序依然比较简单,是将一个元组哈希函数的值输出不过这个元组的值根据输入而定,但是我没有采取循环的方法,先定义一个列表,再把元素依次添加进这个列表中,而是直接用了一个类型转换+切片的方式将输入...
  • 哈希(Hash)和哈希树(Merkle tree) 哈希函数(英语:Hash function)又称散列函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的... 散列...
  • 哈希算法 将任意长度的二进制值串映 射为固定长度的二进制值串,这个映射的规则就是哈希算法, 通过原始数据映射之后得到的二进制值串就是哈希值 需要满足的几点要求 从哈希值不能反向推导出原始数据(所以...
  • 哈希算法和哈希学习分类

    千次阅读 多人点赞 2018-01-17 18:41:51
    哈希 1.先来了解一下Hash的基本思路: 设要存储对象的个数为num, 那么我们就用len个内存单元来存储它们(len>=num); 以每个对象ki的关键字为自变量,用一个函数h(ki)来映射出ki的内存地址,也就是ki的下标,将...
  • 如何在Python中计算文件的MD5哈希

    千次阅读 2020-05-19 16:21:54
    如何在Python中计算文件的MD5哈希 MD5是一种消息摘要算法,用于从可变输入数据中创建唯一的固定大小值。MD5通常用于检查文件在传输过程中是否损坏(在这种情况下,哈希值称为校验和)。文件中的任何更改都将导致不同...
  • 密码散列函数通过哈希算法(又称摘要算法、散列算法)将任意长度的数据转换为一个固定长度的二进制数据(通常用16进制字符串表示)。 常见密码散列函数 常见的密码散列函数有:md5是128位(32个字符)、sha1是160位(40个...
  • 哈希函数和数字签名

    2021-09-13 18:54:27
    目录1 哈希函数 Hash1.1 构造方法1.2 哈希函数在密码学的应用2 数字签名2.1 签名--认证流程2.2 一个生动形象的例子 在讲数字前面以前,我们先要了解一下哈希函数 1 哈希函数 Hash Hash,一般翻译做散列、杂凑,或...
  • 哈希表又称散列表,通过把关键字key映射到数组中的一个位置来访问记录。映射过程通过函数实现,而这个函数就叫哈希函数,存放关键字的数组称为散列表。 哈希表结构 前面说了,关键字是存放在数组中的,所以...
  • 字符串哈希函数

    千次阅读 2018-03-10 16:58:16
    1.简介本文将介绍什么是字符串哈希函数,字符串哈希函数常见用法,以及字符串哈希函数的实现原理和常用算法。2.概念哈希之所以广泛存在,是因为它能在绝大多数情况下可以在O(1)的时间复杂度中完成元素的查找。它的...
  • 每日一练20210731

    2021-07-31 21:31:46
    设有n个关键字具有相同的Hash函数值,则用线性探测法把这n个关键字映射到Hash表中需要做几次线性探测? 2021-07-31 21:30:55 A、 n2 B、 n*(n+1) C、 n*(n+1)/2 D、 n*(n-1)/2 回答正确正确答案:D 解析: ...
  • 哈希函数之MD5

    千次阅读 2019-01-11 20:20:42
    1.MD5算法是输入长度小于`2^64`比特的消息,输出为128比特的消息摘要。 2.输入消息以512比特的分组为单位处理。
  • #define MaxSize 100 //定义最大哈希表长度 #define NULLKEY -1 //定义空关键字值 #define DELKEY -2 //定义被删关键字值 typedef int KeyType; //关键字类型 typedef char * InfoType; //其他数据类型

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,235
精华内容 3,294
关键字:

哈希函数值