FFMPEG学习【libavutil】:Crypto and Hashing(五)

来源:互联网 发布:烟花特效软件 编辑:程序博客网 时间:2024/05/18 02:06

哈希功能在多媒体中很有用。


哈希函数广泛应用于多媒体,从错误检查和隐藏到内部回归测试。 libavutil具有可以对FFmpeg和其他多媒体应用程序有用的各种哈希函数的高效实现。


一、Adler-32

一)、函数

unsigned long av_adler32_update (unsigned long adler, const uint8_t *buf, unsigned int len) av_pure计算缓冲区的Adler32校验和。

参数:adler:初始校验和值

    buf:指向输入缓冲区的指针

    len:输入缓冲区的大小

返回:更新校验和



二、CRC

一)、类型定义

typedef uint32_t AVCRC


二)、枚举

enum  AVCRCId { 
  AV_CRC_8_ATM, AV_CRC_16_ANSI, AV_CRC_16_CCITT, AV_CRC_32_IEEE, 
  AV_CRC_32_IEEE_LE, AV_CRC_16_ANSI_LE, AV_CRC_24_IEEE = 12, AV_CRC_MAX 
}


三)、函数

int av_crc_init (AVCRC *ctx, int le, int bits, uint32_t poly, int ctx_size)初始化CRC表。

参数:ctx:必须是大小sizeof(AVCRC)* 257或sizeof(AVCRC)* 1024的数组

    le:如果为1,则最低位表示相应多项式(对于多重和实际CRC两者)的最高指数的系数。 如果为0,则必须交换CRC参数和av_crc的结果,如果需要标准表示(在大多数情况下可简化为例如bswap16):av_bswap32(crc <<(32位))

    bits:CRC的位数

    poly:在没有x **位系数的生成多项式中,在由le指定的表示中

    ctx_size:ctx的大小(以字节为单位)

返回:<0表示失败。


const AVCRC * av_crc_get_table (AVCRCId crc_id)获取一个初始化的标准CRC表。

参数:crc_id:标准CRC的ID

返回:指向CRC表的指针或失败时为NULL


uint32_t av_crc (const AVCRC *ctx, uint32_t crc, const uint8_t *buffer, size_t length) av_pure计算块的CRC。

参数:crc:先前块的CRC(如果有)或CRC的初始值

返回:使用给定块的数据更新CRC



三、通用哈希API

一)、宏

#define AV_HASH_MAX_SIZE   64av_hash_get_size()当前将返回的最大值。

如果您绝对想要或需要为输出缓冲区使用静态分配,则可以使用此选项,并且不支持新添加到libavutil中而不重新编译的哈希值。

警告:添加更大尺寸的新散列,并在增加宏时不会被认为是ABI的变化。 为了防止代码溢出缓冲区,可以使用av_hash_get_size()动态分配输出缓冲区,也可以在编译期间将哈希API的使用限制在已经在FFmpeg中的哈希值。


二)、函数

int av_hash_alloc (struct AVHashContext **ctx, const char *name)为名称指定的算法分配哈希上下文。

返回:> = 0成功,否定错误代码失败

注意:在调用此函数后,上下文不被初始化; 你必须调用av_hash_init()这样做。


const char * av_hash_names (int i)获取可用哈希算法的名称。

该函数可用于枚举算法

参数:i:散列算法的索引,从0开始

返回:指向静态字符串,如果i超出范围,则为NULL


const char * av_hash_get_name (const struct AVHashContext *ctx)获取与给定哈希上下文对应的算法的名称。


int av_hash_get_size (const struct AVHashContext *ctx)获取哈希值的大小(以字节为单位)。

此函数当前返回的最大值作为宏AV_HASH_MAX_SIZE可用。

参数:ctx:哈希上下文

返回:哈希值的大小(以字节为单位)


void av_hash_init (struct AVHashContext *ctx)初始化或重置哈希上下文。

参数:ctx:哈希上下文


void av_hash_update (struct AVHashContext *ctx, const uint8_t *src, int len)使用附加数据更新哈希上下文。

参数:ctx:哈希上下文

    src:要添加到哈希上下文的数据

    len:附加数据的大小


void av_hash_final (struct AVHashContext *ctx, uint8_t *dst)完成哈希上下文并计算实际的哈希值。

dst缓冲区的最小大小由av_hash_get_size()或AV_HASH_MAX_SIZE给出。

如果已经完成更新或最终确定哈希上下文是不安全的。

参数:ctx:哈希上下文

    dst:最终哈希值将被存储的位置


void av_hash_final_bin (struct AVHashContext *ctx, uint8_t *dst, int size)完成哈希上下文并将实际哈希值存储在缓冲区中。

如果已经完成更新或最终确定哈希上下文是不安全的。

如果大小小于哈希大小(由av_hash_get_size()给出),那么哈希将被截断; 如果大小较大,则缓冲区用0填充。

参数:ctx:哈希上下文

    dst:最终哈希值将被存储的位置

    size:要写入dst的字节数


void av_hash_final_hex (struct AVHashContext *ctx, uint8_t *dst, int size)完成散列上下文并将实际散列值的十六进制表示形式存储为字符串。

如果已经完成更新或最终确定哈希上下文是不安全的。

字符串始终为0终止。

如果大小小于2 * hash_size + 1,其中hash_size是av_hash_get_size()返回的值,则字符串将被截断。

参数:ctx:哈希上下文

    dst:字符串将被存储在哪里

    size:要写入dst的最大字节数


void av_hash_final_b64 (struct AVHashContext *ctx, uint8_t *dst, int size)完成哈希上下文,并将实际哈希值的Base64表示形式存储为字符串。

如果已经完成更新或最终确定哈希上下文是不安全的。

字符串始终为0终止。

如果大小小于AV_BASE64_SIZE(hash_size),其中hash_size是av_hash_get_size()返回的值,则字符串将被截断。

参数:ctx:哈希上下文

    dst:最终哈希值将被存储的位置

    size:要写入dst的最大字节数


void av_hash_freep (struct AVHashContext **ctx)自由哈希上下文,并将哈希上下文指针设置为NULL。

参数:ctx:指向哈希上下文的指针



四、MD5

一)、函数

struct AVMD5 * av_md5_alloc (void)分配AVMD5上下文。


void av_md5_init (struct AVMD5 *ctx)初始化MD5散列。

参数:ctx:指向函数上下文(大小为av_md5_size)的指针


void av_md5_update (struct AVMD5 *ctx, const uint8_t *src, int len)更新哈希值。

参数:ctx:散列函数上下文

    src:输入数据来更新哈希

    len:输入数据的长度


void av_md5_final (struct AVMD5 *ctx, uint8_t *dst)完成散列和输出摘要值。

参数:ctx:散列函数上下文

    dst:存储输出摘要值的缓冲区


void av_md5_sum (uint8_t *dst, const uint8_t *src, const int len)哈希数组数组。

参数:dst:将消息写入的输出缓冲区

    src:数据要哈希

    len:数据的长度(以字节为单位)


二)、变量

const int av_md5_size


五、Murmur3

MurmurHash3哈希函数实现。


MurmurHash3是一种非加密散列函数,其发明人Austin Appleby创建了三个不兼容的版本:

1、32位输出

2、32位平台的128位输出

3、64位平台的128位输出


FFmpeg仅实现最后一个变体:为64位平台设计的128位输出。 即使哈希函数是为64位平台而设计的,但现实中的功能也在32位系统上工作,只有降低性能。


通过设计,MurmurHash3需要种子才能操作。 为此,libavutil提供了两个用于哈希启动的功能,一个需要一个种子(av_murmur3_init_seeded()),一个使用固定的任意整数作为种子,因此不(av_murmur3_init())。


为了使哈希值相当,您应该为所有调用此哈希函数提供相同的种子 - 如果您自己提供一个。


一)、函数

struct AVMurMur3 * av_murmur3_alloc (void)分配AVMurMur3哈希上下文。

返回:未初始化的哈希上下文或在出现错误的情况下为NULL


void av_murmur3_init_seeded (struct AVMurMur3 *c, uint64_t seed)使用种子初始化或重新初始化AVMurMur3哈希上下文。

参数:c:哈希上下文

    seed:随机种子


void av_murmur3_init (struct AVMurMur3 *c)初始化或重新初始化AVMurMur3哈希上下文。

相当于具有内置种子的av_murmur3_init_seeded()。

参数:c:哈希上下文


void av_murmur3_update (struct AVMurMur3 *c, const uint8_t *src, int len)使用新数据更新哈希上下文。

参数:c:哈希上下文

    src:输入数据来更新哈希

    len:从src读取的字节数


void av_murmur3_final (struct AVMurMur3 *c, uint8_t dst[16])完成散列和输出摘要值。

参数:c:哈希上下文

    dst:存储输出摘要值的缓冲区



六、RIPEMD

一)、函数

struct AVRIPEMD * av_ripemd_alloc (void)分配AVRIPEMD上下文。


int av_ripemd_init (struct AVRIPEMD *context, int bits)初始化RIPEMD散列。

参数:context:指向函数上下文(大小av_ripemd_size)的指针

    bits:摘要中的位数(128,160,256或320位)

返回:如果初始化成功,则为零,否则为-1


void av_ripemd_update (struct AVRIPEMD *context, const uint8_t *data, unsigned int len)更新哈希值。

参数:context:散列函数上下文

    data:输入数据来更新哈希

    len:输入数据长度

    


void av_ripemd_final (struct AVRIPEMD *context, uint8_t *digest)完成散列和输出摘要值。

参数:context,:散列函数上下文

    digest:存储输出摘要值的缓冲区


二)、变量

const int av_ripemd_size


七、SHA

SHA-1和SHA-256(安全散列算法)散列函数实现。


该模块支持以下SHA散列函数:

1、SHA-1:160位

2、SHA-224:224位,作为SHA-2的变体

3、SHA-256:256位,作为SHA-2的变体


一)、函数

struct AVSHA * av_sha_alloc (void)分配AVSHA上下文。


int av_sha_init (struct AVSHA *context, int bits)初始化SHA-1或SHA-2哈希。

参数:context:指向函数上下文(大小为av_sha_size)的指针

    bits:摘要中的位数(SHA-1 - 160位,SHA-2 224或256位)

返回:如果初始化成功,则为零,否则为-1


void av_sha_update (struct AVSHA *ctx, const uint8_t *data, unsigned int len)更新哈希值。

参数:ctx:散列函数上下文

    data:输入数据来更新哈希

    len:输入数据长度


void av_sha_final (struct AVSHA *context, uint8_t *digest)完成散列和输出摘要值。

参数:context:散列函数上下文

    digest:存储输出摘要值的缓冲区


二)、变量

const int av_sha_size


八、SHA-512

SHA-512(安全散列算法)散列函数实现。


该模块支持以下SHA-2散列函数:

1、SHA-512/224:224位

2、SHA-512/256:256位

3、SHA-384:384位

4、SHA-512:512位


一)、函数

struct AVSHA512 * av_sha512_alloc (void)分配AVSHA512上下文。


int av_sha512_init (struct AVSHA512 *context, int bits)初始化SHA-2 512散列。

参数:context:指向函数上下文(大小为av_sha512_size)

    bits:摘要中的位数(224,256,384或512位)

返回:如果初始化成功,则为零,否则为-1


void av_sha512_update (struct AVSHA512 *context, const uint8_t *data, unsigned int len)更新哈希值。

参数:context:散列函数上下文

    data:输入数据来更新哈希

    len:输入数据长度


void av_sha512_final (struct AVSHA512 *context, uint8_t *digest)完成散列和输出摘要值。

参数:context:散列函数上下文

    digest:存储输出摘要值的缓冲区


二)变量

const int av_sha512_size