FFmpeg
murmur3.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2013 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * @ingroup lavu_murmur3
24  * Public header for MurmurHash3 hash function implementation.
25  */
26 
27 #ifndef AVUTIL_MURMUR3_H
28 #define AVUTIL_MURMUR3_H
29 
30 #include <stddef.h>
31 #include <stdint.h>
32 
33 #include "version.h"
34 
35 /**
36  * @defgroup lavu_murmur3 Murmur3
37  * @ingroup lavu_hash
38  * MurmurHash3 hash function implementation.
39  *
40  * MurmurHash3 is a non-cryptographic hash function, of which three
41  * incompatible versions were created by its inventor Austin Appleby:
42  *
43  * - 32-bit output
44  * - 128-bit output for 32-bit platforms
45  * - 128-bit output for 64-bit platforms
46  *
47  * FFmpeg only implements the last variant: 128-bit output designed for 64-bit
48  * platforms. Even though the hash function was designed for 64-bit platforms,
49  * the function in reality works on 32-bit systems too, only with reduced
50  * performance.
51  *
52  * @anchor lavu_murmur3_seedinfo
53  * By design, MurmurHash3 requires a seed to operate. In response to this,
54  * libavutil provides two functions for hash initiation, one that requires a
55  * seed (av_murmur3_init_seeded()) and one that uses a fixed arbitrary integer
56  * as the seed, and therefore does not (av_murmur3_init()).
57  *
58  * To make hashes comparable, you should provide the same seed for all calls to
59  * this hash function -- if you are supplying one yourself, that is.
60  *
61  * @{
62  */
63 
64 /**
65  * Allocate an AVMurMur3 hash context.
66  *
67  * @return Uninitialized hash context or `NULL` in case of error
68  */
69 struct AVMurMur3 *av_murmur3_alloc(void);
70 
71 /**
72  * Initialize or reinitialize an AVMurMur3 hash context with a seed.
73  *
74  * @param[out] c Hash context
75  * @param[in] seed Random seed
76  *
77  * @see av_murmur3_init()
78  * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of
79  * seeds for MurmurHash3.
80  */
81 void av_murmur3_init_seeded(struct AVMurMur3 *c, uint64_t seed);
82 
83 /**
84  * Initialize or reinitialize an AVMurMur3 hash context.
85  *
86  * Equivalent to av_murmur3_init_seeded() with a built-in seed.
87  *
88  * @param[out] c Hash context
89  *
90  * @see av_murmur3_init_seeded()
91  * @see @ref lavu_murmur3_seedinfo "Detailed description" on a discussion of
92  * seeds for MurmurHash3.
93  */
94 void av_murmur3_init(struct AVMurMur3 *c);
95 
96 /**
97  * Update hash context with new data.
98  *
99  * @param[out] c Hash context
100  * @param[in] src Input data to update hash with
101  * @param[in] len Number of bytes to read from `src`
102  */
103 #if FF_API_CRYPTO_SIZE_T
104 void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, int len);
105 #else
106 void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, size_t len);
107 #endif
108 
109 /**
110  * Finish hashing and output digest value.
111  *
112  * @param[in,out] c Hash context
113  * @param[out] dst Buffer where output digest value is stored
114  */
115 void av_murmur3_final(struct AVMurMur3 *c, uint8_t dst[16]);
116 
117 /**
118  * @}
119  */
120 
121 #endif /* AVUTIL_MURMUR3_H */
av_murmur3_alloc
struct AVMurMur3 * av_murmur3_alloc(void)
Allocate an AVMurMur3 hash context.
Definition: murmur3.c:34
av_murmur3_update
void av_murmur3_update(struct AVMurMur3 *c, const uint8_t *src, int len)
Update hash context with new data.
Definition: murmur3.c:95
src
#define src
Definition: vp8dsp.c:255
av_murmur3_final
void av_murmur3_final(struct AVMurMur3 *c, uint8_t dst[16])
Finish hashing and output digest value.
Definition: murmur3.c:147
seed
static unsigned int seed
Definition: videogen.c:78
c
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
Definition: undefined.txt:32
AVMurMur3
Definition: murmur3.c:27
uint8_t
uint8_t
Definition: audio_convert.c:194
len
int len
Definition: vorbis_enc_data.h:452
version.h
av_murmur3_init_seeded
void av_murmur3_init_seeded(struct AVMurMur3 *c, uint64_t seed)
Initialize or reinitialize an AVMurMur3 hash context with a seed.
Definition: murmur3.c:39
av_murmur3_init
void av_murmur3_init(struct AVMurMur3 *c)
Initialize or reinitialize an AVMurMur3 hash context.
Definition: murmur3.c:45