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上下文。参数:context:指向函数上下文(大小为av_sha512_size)
bits:摘要中的位数(224,256,384或512位)
返回:如果初始化成功,则为零,否则为-1
参数:context:散列函数上下文
data:输入数据来更新哈希
len:输入数据长度
参数:context:散列函数上下文
digest:存储输出摘要值的缓冲区
二)变量
const int av_sha512_size- FFMPEG学习【libavutil】:Crypto and Hashing(五)
- FFMPEG学习【libavutil】:Crypto and Hashing(一)
- FFMPEG学习【libavutil】:Crypto and Hashing(二)
- FFMPEG学习【libavutil】:Crypto and Hashing(三)
- FFMPEG学习【libavutil】:Crypto and Hashing(四)
- FFMPEG学习【libavutil】:Mathematics
- FFMPEG学习【libavutil】:Mathematics:AVRational
- FFMPEG学习【libavutil】:String Manipulation
- FFMPEG学习【libavutil】:视频相关
- FFMPEG学习【libavutil】:Memory Management(一)
- FFMPEG学习【libavutil】:Memory Management(二)
- FFMPEG学习【libavutil】:数据结构(一)
- FFMPEG学习【libavutil】:数据结构(二)
- FFMPEG学习【libavutil】:数据结构(三)
- FFMPEG学习【libavutil】:数据结构(四)
- FFMPEG学习【libavutil】:音频相关(一)
- FFMPEG学习【libavutil】:音频相关(二)
- FFMPEG学习【libavutil】:音频相关(三)
- mysql 操作
- 路由器怎么设置花生壳
- GitLab8取消用户注册邮箱验证功能
- WinForm下波形图的绘制
- Apple Music卡片弹出动画的实现
- FFMPEG学习【libavutil】:Crypto and Hashing(五)
- Linux性能监控工具Nmon安装使用
- [LeetCode] 191. Number of 1 Bits
- ubuntu系统git命令总结----持续更新!
- 加密(学习自《java开发实战1200例》)
- 数据库索引
- GetLBText()和GetWindowText()区别
- 关于安装composer一些基本操作
- SVN服务的搭建、配置、导出与导入