[代码实例][Linux系统编程]遍历目录并且输出目录下文件MD5值

对.dat文件进行MD5哈希计算 对.dat文件进行MD5哈希计算以及MD5哈希计算本身的含义就介绍到这里。总结来看,MD5哈希计算主要用于验证数据的完整性和一致性,保护信息不被篡改,并且在密码存储和数字签名等场合提高安全性。尽管MD5现如今已不再适用于那些需要高等级加密的场合,但在某些非安全敏感的场景中,它仍然因其计算速度快而被广泛使用。在Windows操作系统的命令提示符(CMD)下,使用命令来处理文件。文件进行MD5哈希计算,用于验证文件完整性或作为某种形式的数据审计。总的来说,图片中记录的是一系列的文件处理操作,特别是对。 阅读详情

main.c:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <errno.h>

#include <limits.h>
#include <dirent.h>


#define MIN(x,y)    (((x) < (y)) ? (x) : (y))

#define IS_APATH(p)  (*(p) == '/')
#define IS_RPATH(p)  (!(IS_APATH(p)))

char * md54file(const char * filename, char * md5str, bool isupper);

void calculate_files(const char * dir_path);

int main(int argc, char * argv[])
{
    char path[PATH_MAX] = {0};

    if((argc == 2 && strcmp(argv[1], "--help") == 0)
        || argc != 2)
    {
        printf("Usage: %s <path>\n", argv[0]);
        return EXIT_SUCCESS;
    }

    if(strlen(argv[1]) >= PATH_MAX)
    {
        fprintf(stderr, "Path length is too long!\n");
        return EXIT_FAILURE;
    }

    if(IS_RPATH(argv[1]))
        realpath(argv[1], path);
    else
        strncpy(path, argv[1], PATH_MAX);

    calculate_files(path);

    return EXIT_SUCCESS;
}

void calculate_files(const char * dir_path)
{
    DIR * dirp;
    struct dirent * dp;
    bool is_root;
    char path[PATH_MAX] = {0};
    char md5str[33] = {0};

    is_root = strcmp(dir_path, "/") == 0;

    if((dirp = opendir(dir_path)) == NULL)
    {
        perror("opendir");
        return;
    }

    while(true)
    {
        errno = 0;
        if((dp = readdir(dirp)) == NULL)
            break;

        if(strcmp(dp->d_name, ".") == 0 || strcmp(dp->d_name, "..") == 0)
            continue;


        snprintf(path, PATH_MAX, "%s/%s", (is_root ? "" : dir_path), dp->d_name);
        if(dp->d_type == DT_DIR)
            calculate_files(path);
        else if(dp->d_type == DT_REG)
        {
            if(md54file(path, md5str, false))
                printf("%s  %s\n", md5str, path);
        }
    }

    if(closedir(dirp) != 0)
    {
        perror("closedir");
        return;
    }
}

md54file.c:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <math.h>

#define BITS_PER_BYTE   8

#define GROUP_BITS      512
#define GROUP_SIZE      (GROUP_BITS / BITS_PER_BYTE)    // 64

#define SUBGROUPS_PER_GROUP 16
#define SUBGROUP_BITS       (GROUP_BITS / SUBGROUPS_PER_GROUP)  // 32
#define SUBGROUP_SIZE       (GROUP_SIZE / SUBGROUPS_PER_GROUP)  // 4

#define VAR_INPUT_LEN_SIZE  8

#define ROL(val,n)  (((val) << (n)) | ((val) >> (32 - (n))))
#define ABS(x)      ((x) >= 0 ? (x) : -(x))

#define F(x,y,z)    (((x) & (y)) | ((~(x)) & (z)))
#define G(x,y,z)    (((x) & (z)) | ((y) & (~(z))))
#define H(x,y,z)    ((x) ^ (y) ^ (z))
#define I(x,y,z)    (y ^ ((x) | (~(z))))

#define BUF_SIZE    1024
static unsigned char read_buf[BUF_SIZE + GROUP_SIZE] = {0};

static bool has_init_ti = false;

static unsigned int state_init[] = {
    0x67452301,
    0xEFCDAB89,
    0x98BADCFE,
    0x10325476
};

static unsigned int ti[64];
static unsigned int round_index[64];
static const unsigned int s[][4] = {
    {7, 12, 17, 22}, {7, 12, 17, 22}, {7, 12, 17, 22}, {7, 12, 17, 22}, 
    {5, 9, 14, 20}, {5, 9, 14, 20}, {5, 9, 14, 20}, {5, 9, 14, 20}, 
    {4, 11, 16, 23}, {4, 11, 16, 23}, {4, 11, 16, 23}, {4, 11, 16, 23}, 
    {6, 10, 15, 21}, {6, 10, 15, 21}, {6, 10, 15, 21}, {6, 10, 15, 21}
};

static int add_bits(unsigned char * buf, size_t src_len);
static void transform(unsigned char sub_group[SUBGROUPS_PER_GROUP][SUBGROUP_SIZE], unsigned int * state);
char * md54file(const char * filename, char * md5str, bool isupper);
static void md5init(void);

static void md5init(void)
{
    if(!has_init_ti)
    {
        for(int i = 0; i < 64; i++)
            ti[i] = (1UL << 32) * ABS(sin(i + 1));
        has_init_ti = true;
    }

}

char * md54file(const char * filename, char * md5str, bool isupper)
{
    unsigned char * group_start = NULL;
    size_t dest_len = 0;
    unsigned char sub_group[SUBGROUPS_PER_GROUP][SUBGROUP_SIZE] = {0};
    unsigned int state[4] = {0};
    unsigned char * pstate = (unsigned char *)state;
    char * poutput = md5str;

    md5init();

    FILE * fp;
    size_t count;

    if((fp = fopen(filename, "r")) == NULL)
    {
        perror("fopen");
        return NULL;
    }

    memcpy(state, state_init, sizeof(int) * 4);

    memset(read_buf, 0, BUF_SIZE + GROUP_SIZE);
    while((count = fread(read_buf, 1, BUF_SIZE, fp)) > 0)
    {
        dest_len += count;
        group_start = read_buf;
        for(int i = 0;
            i < count / GROUP_SIZE;
            i++, group_start += GROUP_SIZE)
        {
            memcpy((unsigned char *)sub_group, group_start, GROUP_SIZE);
            transform(sub_group, state);
        }

        if(count % GROUP_SIZE != 0)
        {
            count %= GROUP_SIZE;
            break;
        }

        memset(read_buf, 0, BUF_SIZE);
    }
    if(ferror(fp))
    {
        perror("fread");
        return NULL;
    }
    else if(feof(fp))
    {
        int times = 0;
        if(count == 0)
        {
            memset(read_buf, 0, BUF_SIZE);
            group_start = read_buf;
        }
        else
            memset(group_start + count, 0, GROUP_SIZE - count);
        times = add_bits(group_start, dest_len);

        for(int i = 0; i < times; i++)
        {
            memcpy((unsigned char *)sub_group, group_start, GROUP_SIZE);
            transform(sub_group, state);
            group_start += GROUP_SIZE;
        }
    }

    if(fclose(fp) != 0)
    {
        perror("fclose");
        return NULL;
    }

    for(int i = 0; i < 16; i++)
    {
        if(isupper)
            snprintf(poutput, 3, "%02X", *pstate);
        else
            snprintf(poutput, 3, "%02x", *pstate);
        poutput += 2;
        pstate++;
    }

    return md5str;
}

static int add_bits(unsigned char * buf, size_t src_len)
{
    size_t current_len;
    size_t rest_len;
    size_t dest_len;
    unsigned char * dest;
    int times = 1;

    current_len = src_len % GROUP_SIZE;
    if(current_len == 0)
        dest_len = GROUP_SIZE;
    else
        dest_len = (current_len + GROUP_SIZE - 1) / GROUP_SIZE * GROUP_SIZE;
    rest_len = GROUP_SIZE - current_len % GROUP_SIZE;

    if(rest_len <= VAR_INPUT_LEN_SIZE)
    {
        dest_len += GROUP_SIZE;
        memset(read_buf + BUF_SIZE, 0, GROUP_SIZE);
        times++;
    }

    buf[current_len] = 0x80;
    *(unsigned long long *)(buf + dest_len - VAR_INPUT_LEN_SIZE) = (unsigned long long)src_len * BITS_PER_BYTE;

    return times;
}

/*
 * transform: 转换分组
 */
static void transform(unsigned char sub_group[SUBGROUPS_PER_GROUP][SUBGROUP_SIZE], unsigned int * state)
{
    unsigned int a;
    unsigned int b;
    unsigned int c;
    unsigned int d;
    unsigned int tmp;

    unsigned int result, index;

    a = state[0];
    b = state[1];
    c = state[2];
    d = state[3];

    for(int i = 0; i < 64; i++)
    {
        if(i < 16)
        {
            result = F(b, c, d);
            index = i;
        }
        else if(i < 32)
        {
            result = G(b, c, d);
            index = (5 * i + 1) % 16;
        }
        else if(i < 48)
        {
            result = H(b, c, d);
            index = (3 * i + 5) % 16;
        }
        else
        {
            result = I(b, c, d);
            index = (7 * i) % 16;
        }

        tmp = d;
        d = c;
        c = b;
        b = b + ROL(
                    a + result + *(unsigned int *)&sub_group[index] + ti[i],
                    *((const unsigned int *)s + i));
        a = tmp;
    }

    state[0] += a;
    state[1] += b;
    state[2] += c;
    state[3] += d;
}

Makefile:

all: md54file

md54file: main.c md54file.c
    gcc $^ -o $@ -g -lm
使用AutoDL云服务器训练YOLO计算机视觉网络模型(AutoDL+Xftp+VS Code),附详细操作步骤 AutoDL AI算力云是一个提供人工智能算力服务的云平台。丰富的GPU资源:提供多种GPU型号,包括NVIDIA的A100A800L40V100RTX 4090RTX 3090等,能满足我们在不同场景下的需求,无论是进行大规模的AI训练还是复杂的科学计算等任务,都可以找到合适的GPU资源。灵活的付费方式:支持按量付费包日包周包月等多种付费模式。对于短期的实验或不确定时长的项目,可以选择按量付费;如果有长期稳定的算力需求,预付费或包周包月则可能更划算,可以根据自己的需求和预算进行选择。集成主流框架:集成了。 阅读详情

相关推荐

S7-1200PLC 与温控仪表Modbus RTU通信

硬件:cpu 1214C 目的:通过Modbus RTU协议,实现对温控仪表的控制 软件:Portal V14SP1

weixin_43922025的博客 3万+

【MD5算法_C语言实现】

Message Digest Algorithm 消息摘要算法: 5表示第5版 算法的文件号为RFC 1321 本质: 算法不可逆 不同的数据可能会生成相同的一串 有破解之道,比如穷举法,暴力破解。 根据生成的数据串,在数据库中找生成他的数据数据库是在时时刻刻的收集枚举各种数据组合。 应用:比如登录密码 本地注册时填入密码,本地将密码转成md5串,传输给服务器,服务器存的密码就是md5串。中途被坏人劫走的密码,劫走的只是md5串,而不是密码本身,这也是一种保护。 很多验证都应用的md5 ...

Sugar_wolf的博客 6227

深度学习 tesorflow2.0版本 入门第一章

为什么要学tensflow 深度学习发展迅猛 框架灵活 google开发 公司应用广泛 2.0更加灵活 后面会学习的项目 图像分类 房价预测 泰坦尼克号生存预测 文本分类 文本生成 机器翻译 核心部分 模型训练 tesorboard----> 查看模型训练进度 模型保存和部署 分布式训练-----> 加速训练速度,提升训练效率 TensorFlow常用库:Tfds, tfhub,tensor2tensor 多平台云端环境GPU:Goolgle cloud环境配置,AWS环境配置 kaggle平

weixin_46969441的博客 1237

大文件MD5计算 C语言 (从OpenSSL库中分离算法:三)

从OpenSSL库中分离算法-MD5算法-大文件MD5计算 续上述博客 小文件计算MD5时,可以把文件数据一次性都读到内存中计算,但当文件很大时,将文件一次性读到内存中是不可行的,此时,需要对文件数据分块进行MD5计算。具体方法如下: 跳转到实操视频 C语言计算大文件MD5 #include <iostream> #include "md5/md5.h" #define B

逆光倾城的博客 3041

Nacos漏洞利用工具V3.0.5实战:从认证绕开到内存马植入的全流程指南

本文详细解析了Nacos漏洞利用工具V3.0.5在实战中的应用,从认证绕开到内存马植入的全流程。文章深入探讨了如何利用Nacos的历史漏洞,如默认口令、认证逻辑绕过、Derby SQL注入及Jraft反序列化,实现权限提升与持久化控制,并提供了防御视角与加固建议,旨在帮助安全人员理解攻击链以加强防护。

h6j7k8l9p0的博客 483

SMRATS(一) SMARTS+PPO baseline运行教程

python类方法 class Agent: @classmethod def from_function() python typing 含义 为防止弱类型python出现忘记变量类型的问题,python3.5及之后版本增加了对应的类型提示。 输入和输出类型 函数接受并返回一个字符串,注释像下面这样: def greeting(name: str) -> str: return 'Hello ' + name 常用的typing类型 int,long,float: 整型,

Freshduke的博客 1415

[代码实例][C语言]计算文件的MD5值

此算法有个BUG#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h> #include <math.h>#define BITS_PER_BYTE 8#define GROUP_BITS 512 #define GROUP_SIZE (GROUP_BITS / BITS_

火云的专栏 3491

EastWave应用案例:机箱屏蔽效能仿真

如何使用EastWave对机箱的电磁屏蔽效能进行仿真

2201_76034687的博客 1395

MD5算法的C语言实现

算法原理概述 MD5信息摘要算法,( Message-Digest Algorithm 5),是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用于确保信息传输完整一致。 MD5算法使用little-endian(小端模式,即低位字节存在内存低地址),输入任意不定长度信息,算法都首先将其以512-bit进行分组(不足补位),每个512-bit的分组都和四个32-bit的数...

White3zz的博客 2868

银河麒麟V10-ARM架构-postgresql安装与部署指南

本文详细介绍应用源码进行pgsql的安装步骤,本文以postgresql-12.0为例。提示:以下是本篇文章正文内容,下面案例可供参考银河麒麟系统安装程序比较繁琐,潜在问题比较多,个人建议均通过源码自定义编译安装。国产系统还需努力啊!

idols_man的博客 1万+

【雕爷学编程】Arduino动手做(75)---TTL转RS-485模块之二线制可以实现真正的多点双向通信

37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来---小小的进步或是搞不掂的问题,希望能够抛砖引玉。 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 实验七十五:TTL转RS-485模块 MAX485 RS485模块 MAX485 是一个8.

雕爷学编程 1万+

C语言实例_获取文件MD5值

MD5(Message Digest Algorithm 5)是一种常用的哈希函数算法。将任意长度的数据作为输入,并生成一个唯一的、固定长度(通常是128位)的哈希值,称为MD5值。MD5算法以其高度可靠性和广泛应用而闻名。

3450

推荐系统[九]项目技术细节讲解z2:搜索Query理解[Term Weight、Query 改写、同义词扩写]和语义召回技术

在 pooling 方法上,我们也尝试过不同层 pooling,或者在多层上增加 attention 聚合 BERT 多层结果,效果和最后一层所有 token 做 average pooling 相当。损失函数方面,在排序阶段使用pairwise比 pointwise 损失函数的效果会更好。

丨汀、的博客 1109

获得文件MD5——校验完整性 & window 和 Linux下操作

1.Windows 10 自带了一个命令行程序 certutil可以 获取文件的 MD5 值; 2.Linux下md5sum命令获得文件MD5值;

Arya的博客,专注后端领域 4万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux杂项:遍历指定目录计算文件的md5并输出到文件

随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记下来。存在很多在特殊情况下有一点用处的技巧,用的不多的技巧可能一个星期就忘了。想了很久想通过一些手段把这些事情记录下来。也尝试过在书上记笔记,这也只是一时的,书不在手边的时候那些笔记就和没记一样,不是很方便。

嵌入山脊的博客 2815

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

linux 生成文件的md5,Linux下计算文件的MD5值

#!/usr/bin/perluse Digest::MD5;use File::Find;# 2012-11-24 22:41 Leo chanyipiaomiao@163.com# Blog:http://linux5588.blog.51cto.com#用法提示$usage = "Usage: scriptname -p | Directory1 ... | File1 ... | -c M...

weixin_29997937的博客 1030

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

shell脚本-批量获取目录下所有文件的md5值、大小、inode值

MD5的全称是Message-Digest Algorithm 5,它一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5值等同于文件的ID,它的值是唯一的。如果文件已被修改,其MD5值将发生变化。

我希望你能在这找到对你有帮助的东西,这可不仅仅是一个博客呢~ 4139

linux程序计算文件md5,Linux下计算文件的MD5值

脚本功能脚本使用Perl编写,计算文件的MD5值脚本用途服务器在安装完操作系统后,计算PATH变量里面所有的二进制文件的MD5、计算单个文件MD5值、计算某个目录(包括子目录)下所有的文件的MD5值记录到文件,等日后再生成一份,然后2份文件进行对比,即可知道这些文件是否又被改动过.脚本用法(5种用法)脚本名 -p [ > 输出的文件名] ← 该功能是计算...

weixin_39877166的博客 458

linux计算路径名md5,Linux下计算文件的MD5值

#!/usr/bin/perluse Digest::MD5;use File::Find;# 2012-11-24 22:41 Leo chanyipiaomiao@163.com# Blog:http://linux5588.blog.51cto.com#用法提示$usage="Usage:scriptname-p|Directory1...|File1...|-cM...

weixin_30110807的博客 339

Linux命令之校验目录md5deep

`md5deep` 命令比 `md5sum` 功能更加丰富,可以递归检查整个目录树。即计算每一个目录中的文件,为每个子目录中的每个文件生成 MD5 值。

二木成林 2439

文件 md5去重 linux,对比文件md5值实现去重文件

python检测文件的MD5值MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2、MD3和MD4发展而来。MD5算法的使用不需要支付任何版权费用。每个文件都会有一个MD5的加密值,这个值来唯一标识这个文件,它常用来辨别文件的真伪,例如下载系统安装镜像,旁边会附带一个长长的字符乱码,这就是这个镜像的MD5值。文件被修改后其MD5值也会改变,...

weixin_29332623的博客 571

Linux生成目录下md5,linux下使用md5sum递归生成整个目录的md5 [原创]

linux下使用md5sum递归生成整个目录的md5今天要用md5sum操作目录,递归生成目录下所有文件的md5值,结果发现它不支持递归操作于是写了个php脚本处理下代码:$path ='/data/www/bbs/source';$outfile = 'file.md5';get_file_md5($path, $outfile);function get_file_md5($path, $ou...

weixin_28888459的博客 567

linux获取文件的md5,linux shell 获取文件md5的命令linux操作系统 -电脑资料

下面我给各位朋友总结一下在linux中利用shell命令来获取文件md5及遍历目录下所有文件的md5的例子,希望此例子对各位同学会有所帮助,获取文件的MD5值:$ md5sum linuxmint-12-gnome-dvd-32bit.iso|cut -d ' ' -f1得到的MD5值:ee3d6e2ca498bc7685b7f17cdb5f2eea使用MD5校验iso文件:$ md5sum li...

weixin_30240263的博客 866

【linux】md5文件相似校验介绍与实战示例

文章摘要: 本文介绍Linux中MD5校验的多种方法及实用脚本。核心内容包括: 基础命令:使用md5sum或openssl生成文件MD5值,支持提取纯哈希或比对文件一致性。 实用脚本: 校验文件与预期MD5是否匹配; 比对两个文件内容是否相同; 批量生成目录文件的MD5清单并校验完整性。 集成工具:提供交互式菜单脚本md5tool.sh,支持生成清单、单文件校验、文件比对及批量校验功能。适用于文件防篡改、备份验证等场景,提升操作效率与安全性。 (字数:148)

qq_41604569的博客 810

Linux生成目录下md5,Linux系统递归生成目录中文件的md5的方法

$path ='/data/www/bbs/source';$outfile = 'file.md5';get_file_md5($path, $outfile);function get_file_md5($path, $outfile){$path = rtrim($path, '/');if(function_exists('scandir')){$files = scandir($path...

weixin_32469089的博客 266

Linux计算文件md5值脚本-多种命令结合使用记录

Linux计算文件md5值脚本-多种命令结合使用记录脚本内容 脚本内容 #!/bin/bash echo "[-] 计算 rpm 软件包 md5 值写入文件中... 目录: ${1:-未指定}" FILE_DIR=${1:?'[x] 请输入需要检车md5值的文件所在的目录'} MD5_FILE=md5file #FILE_LIST=`find ${FILE_DIR} -type f` #for file in $FILE_LIST; do # echo `md5sum $file`|awk ' #{ #

离风的博客 876
上一篇: [系统操作][Linux]修改当前Ubuntu的启动方式
下一篇: [系统操作][Linux]配置git
cloudblaze
博客等级 码龄17年 81粉丝 125原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值