我是靠谱客的博主 伶俐大侠,这篇文章主要介绍3_08_GLib库入门与实践_数据校验和(MD5、SHA),现在分享给大家,希望可以做个参考。

简介

GLib提供了计算校验和(也叫摘要)的方法,支持MD5、SHA-1、SHA-256等散列算法。

数据结构

数据校验和的数据结构是不透明结构体,只能作为整体使用,无法单独引用其内部成员。

复制代码
1
2
typedef struct _GChecksum GChecksum;

函数列表

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
gssize g_checksum_type_get_length () GChecksum * g_checksum_new () GChecksum * g_checksum_copy () void g_checksum_free () void g_checksum_reset () void g_checksum_update () const gchar * g_checksum_get_string () void g_checksum_get_digest () gchar * g_compute_checksum_for_data () gchar * g_compute_checksum_for_string () gchar * g_compute_checksum_for_bytes ()

函数功能分类

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 获取摘要算法的长度(以字节计) gssize g_checksum_type_get_length () // 创建一个GChecksum对象,摘要算法可以在参数中指定 GChecksum * g_checksum_new () // 复制一个GChecksum对象 GChecksum * g_checksum_copy () // 释放一个GChecksum对象 void g_checksum_free () // 将GChecksum对象重置为其初始状态 void g_checksum_reset () // 将数据累加到GChecksum上,如果要计算的数据比较大,此函数可被多次调用 void g_checksum_update () // 将摘要转换成字符串 const gchar * g_checksum_get_string () // 获取校验和 void g_checksum_get_digest () // 计算校验和 gchar * g_compute_checksum_for_data () gchar * g_compute_checksum_for_string () gchar * g_compute_checksum_for_bytes ()

函数功能说明及综合演示

很多网站提供在线计算MD5、SHAx功能,可以将GLib计算出的结果与网络在线计算的结果进行比较,查看是否正确。Linux系统也有计算MD5和SHAx的命令行工具md5sumsha1sumsha256sum等等,不过只能读入文件,对比是要特别注意文件结尾的换行符是否参与了计算。

MD5校验和

示例代码如下:
源码见glib_examplesglib_checksumglib_checksum_md5

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <glib.h> gint main(gint argc, gchar **argv) { GChecksum *checksum_a = NULL; GChecksum *checksum_b = NULL; checksum_a = g_checksum_new(G_CHECKSUM_MD5); g_checksum_update(checksum_a, "A", strlen("A")); g_print("MD5(A):%s n", g_checksum_get_string(checksum_a)); g_checksum_free(checksum_a); checksum_b = g_checksum_new(G_CHECKSUM_MD5); g_checksum_update(checksum_b, "B", strlen("B")); g_print("MD5(B):%s n", g_checksum_get_string(checksum_b)); g_checksum_free(checksum_b); return 0; }

运行结果:

复制代码
1
2
3
4
[root@centos7_6 build]# ./glib_checksum_md5 md5(A):7fc56270e7a70fa81a5935b72eacbe29 md5(B):9d5ed678fe57bcca610140957afab571

MD5校验和的多步骤计算

如果需要计算的MD5特别大,甚至超过运行内存(如:16GB的文件),则需要将要计算的内容分成多个部分,分别计算。g_checksum_update可将单次计算的值更新到上次计算的结果上,最终得到完整的MD5值。
特别注意的是,在调用g_checksum_update前,不可以调用g_checksum_get_string函数,如果调用,则无法对计算的结果进行更新。在程序运行时也会有错误提示。

示例代码如下:
源码见glib_examplesglib_checksumglib_checksum_md5_update

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <glib.h> gint main(gint argc, gchar **argv) { GChecksum *checksum_a = NULL; GChecksum *checksum_b = NULL; GChecksum *checksum_ab1 = NULL; GChecksum *checksum_ab2 = NULL; checksum_a = g_checksum_new(G_CHECKSUM_MD5); g_checksum_update(checksum_a, "A", strlen("A")); g_print("MD5(A):%s n", g_checksum_get_string(checksum_a)); g_checksum_free(checksum_a); checksum_b = g_checksum_new(G_CHECKSUM_MD5); g_checksum_update(checksum_b, "B", strlen("B")); g_print("MD5(B):%s n", g_checksum_get_string(checksum_b)); g_checksum_free(checksum_b); checksum_ab1 = g_checksum_new(G_CHECKSUM_MD5); g_checksum_update(checksum_ab1, "AB", strlen("AB")); g_print("MD5(AB)(once):%s n", g_checksum_get_string(checksum_ab1)); g_checksum_free(checksum_ab1); checksum_ab2 = g_checksum_new(G_CHECKSUM_MD5); g_checksum_update(checksum_ab2, "A", strlen("A")); //ERROR // g_print("MD5(A):%s n", g_checksum_get_string(checksum_ab2)); g_checksum_update(checksum_ab2, "B", strlen("B")); g_print("MD5(AB)(multi):%s n", g_checksum_get_string(checksum_ab2)); g_checksum_free(checksum_ab2); return 0; }

运行结果:

复制代码
1
2
3
4
5
6
[root@centos7_6 build]# ./glib_checksum_md5_update md5(A):7fc56270e7a70fa81a5935b72eacbe29 md5(B):9d5ed678fe57bcca610140957afab571 md5(AB)(once):b86fc6b051f63d73de262d4c34e3a0a9 md5(AB)(update):b86fc6b051f63d73de262d4c34e3a0a9

SHA1校验和

示例代码如下:
源码见glib_examplesglib_checksumglib_checksum_sha1

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <glib.h> gint main(gint argc, gchar **argv) { GChecksum *checksum_a = NULL; GChecksum *checksum_b = NULL; GChecksum *checksum_ab1 = NULL; GChecksum *checksum_ab2 = NULL; checksum_a = g_checksum_new(G_CHECKSUM_SHA1); g_checksum_update(checksum_a, "A", strlen("A")); g_print("SHA1(A):%s n", g_checksum_get_string(checksum_a)); g_checksum_free(checksum_a); checksum_b = g_checksum_new(G_CHECKSUM_SHA1); g_checksum_update(checksum_b, "B", strlen("B")); g_print("SHA1(B):%s n", g_checksum_get_string(checksum_b)); g_checksum_free(checksum_b); checksum_ab1 = g_checksum_new(G_CHECKSUM_SHA1); g_checksum_update(checksum_ab1, "AB", strlen("AB")); g_print("SHA1(AB)(once):%s n", g_checksum_get_string(checksum_ab1)); g_checksum_free(checksum_ab1); checksum_ab2 = g_checksum_new(G_CHECKSUM_SHA1); g_checksum_update(checksum_ab2, "A", strlen("A")); //ERROR // g_print("SHA1(A):%s n", g_checksum_get_string(checksum_ab2)); g_checksum_update(checksum_ab2, "B", strlen("B")); g_print("SHA1(AB)(multi):%s n", g_checksum_get_string(checksum_ab2)); g_checksum_free(checksum_ab2); return 0; }

运行结果:

复制代码
1
2
3
4
5
6
[root@centos7_6 build]# ./glib_checksum_sha1 SHA1(A):6dcd4ce23d88e2ee9568ba546c007c63d9131c1b SHA1(B):ae4f281df5a5d0ff3cad6371f76d5c29b6d953ec SHA1(AB)(once):06d945942aa26a61be18c3e22bf19bbca8dd2b5d SHA1(AB)(multi):06d945942aa26a61be18c3e22bf19bbca8dd2b5d

最后

以上就是伶俐大侠最近收集整理的关于3_08_GLib库入门与实践_数据校验和(MD5、SHA)的全部内容,更多相关3_08_GLib库入门与实践_数据校验和(MD5、SHA)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(65)

评论列表共有 0 条评论

立即
投稿
返回
顶部