aboutsummaryrefslogtreecommitdiffstats
path: root/libparc/parc/algol/parc_Hash.h
diff options
context:
space:
mode:
Diffstat (limited to 'libparc/parc/algol/parc_Hash.h')
-rwxr-xr-xlibparc/parc/algol/parc_Hash.h341
1 files changed, 341 insertions, 0 deletions
diff --git a/libparc/parc/algol/parc_Hash.h b/libparc/parc/algol/parc_Hash.h
new file mode 100755
index 00000000..92227041
--- /dev/null
+++ b/libparc/parc/algol/parc_Hash.h
@@ -0,0 +1,341 @@
+/*
+ * Copyright (c) 2017 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @file parc_Hash.h
+ * @ingroup datastructures
+ * @brief Implements the FNV-1a 64-bit and 32-bit hashes.
+ *
+ * These are some basic hashing functions for blocks of data and integers. They
+ * generate 64 and 32 bit hashes (They are currently using the FNV-1a algorithm.)
+ * There is also a cumulative version of the hashes that can be used if intermediary
+ * hashes are required/useful.
+ *
+ */
+#ifndef libparc_parc_Hash_h
+#define libparc_parc_Hash_h
+
+#include <stdint.h>
+#include <stdlib.h>
+
+
+struct parc_hash_32bits;
+/**
+ * @typedef PARCHash32Bits
+ * @brief An accumulator
+ */
+
+typedef struct parc_hash_32bits PARCHash32Bits;
+
+/**
+ * Create a 32 bit hash generator
+ *
+ * @return A pointer to a `PARCHash32Bits` instance
+ *
+ * Example:
+ * @code
+ * {
+ * <#example#>
+ * }
+ * @endcode
+ */
+PARCHash32Bits *parcHash32Bits_Create(void);
+
+/**
+ * Generate a 32 bit hash from a memory block starting with a previous hash
+ *
+ * This is a typed version of {@link parcHash32_Data_Cumulative}
+ *
+ * @param [in] hash the value of the last cumulative hash calculated
+ * @param [in] data pointer to a memory block.
+ * @param [in] length length of the memory pointed to by data
+ *
+ * @return pointer to a {@link PARCHash32Bits} with the cumulative hash
+ *
+ * Example:
+ * @code
+ * {
+ * <#example#>
+ * }
+ * @endcode
+ */
+PARCHash32Bits *parcHash32Bits_Update(PARCHash32Bits *hash, const void *data, size_t length);
+
+/**
+ * Generate a 32 bit hash from a uint32 starting with a previous hash
+ * Update the cumulative state of the given {@link PARCHash32Bits}
+ *
+ * @param [in] hash the value of the last cumulative hash calculated
+ * @param [in] value The `uint32` to be hashed
+ *
+ * @return pointer to a `PARCHash32Bits` with the cumulative hash
+ *
+ * Example:
+ * @code
+ * {
+ * <#example#>
+ * }
+ * @endcode
+ */
+PARCHash32Bits *parcHash32Bits_UpdateUint32(PARCHash32Bits *hash, uint32_t value);
+
+/**
+ * Get the current value of the cummulative state of the given {@link PARCHash32Bits}.
+ *
+ * @param [in] hash the value of the last cumulative hash calculated
+ *
+ * @return The hash value as an unsigned 32 bit integer
+ *
+ * Example:
+ * @code
+ * {
+ * <#example#>
+ * }
+ * @endcode
+ */
+uint32_t parcHash32Bits_Hash(PARCHash32Bits *hash);
+
+/**
+ * Acquire a new reference to the given {@link PARCHash32Bits} instance.
+ *
+ * The reference count to the instance is incremented.
+ *
+ * @param [in] hash The instance of `PARCHash32Bits` to which to refer.
+ *
+ * @return The same value as the input parameter @p hash
+ *
+ * Example:
+ * @code
+ * {
+ * <#example#>
+ * }
+ * @endcode
+ */
+PARCHash32Bits *parcHash32Bits_Acquire(const PARCHash32Bits *hash);
+
+/**
+ * Release a reference to the given {@link PARCHash32Bits} instance.
+ *
+ * Only the last invocation where the reference count is decremented to zero,
+ * will actually destroy the `PARCHash32Bits`.
+ *
+ * @param [in,out] hash is a pointer to the `PARCHash32Bits` reference.
+ *
+ * Example:
+ * @code
+ * {
+ * <#example#>
+ * }
+ * @endcode
+ */
+void parcHash32Bits_Release(PARCHash32Bits **hash);
+
+/**
+ * Generate a 64 bit hash from a memory block
+ *
+ * This function will generate a 64bit hash from a block of memory. The memory block
+ * is not modified in any way.
+ *
+ * The output of this function can be used as input for the cumulative version of
+ * this function
+ *
+ * @param [in] data A pointer to a memory block.
+ * @param [in] len The length of the memory pointed to by data
+ *
+ * @return hash_64bit A 64 bit hash of the memory block.
+ *
+ * Example:
+ * @code
+ *
+ * char * data = "Hello world of hashing";
+ * uint64_t myhash = parcHash64_Data(data,strlen(data));
+ *
+ * @endcode
+ *
+ * @see {@link parcHash64_Data_Cumulative}
+ */
+uint64_t parcHash64_Data(const void *data, size_t len);
+
+/**
+ * Generate a 64 bit hash from a memory block starting with a previous hash
+ *
+ * This function will generate a 64 bit hash from a block of memory and an initial
+ * hash. This is used to cumulatively calculate a hash of larger block. So,
+ * one could generate the hash of the first part of the data (A), then calculate the
+ * hash including the next part of the data (AB) and then the hash of the next
+ * part (ABC). This is useful for not having to recalculate the hash of the parts
+ * you have already hashed.
+ *
+ * A cumulative hash should have the same value as a full hash of the complete data.
+ * So cumulative_hash(B,len(B),hash(A)) is equal to hash(AB,len(AB)).
+ *
+ * @param [in] data pointer to a memory block.
+ * @param [in] len length of the memory pointed to by data
+ * @param [in] lastValue the vale of the last cumulative hash calculated
+ *
+ * @return cumulative_hash64 A 64 bit hash of the data _and_ the data that was
+ * hashed before (represented by lastValue).
+ *
+ * Example:
+ * @code
+ *
+ * char * data1 = "1234567890";
+ * uint64_t myhash1 = parcHash64_Data(data1,10);
+ * char * data2 = "abcdefghij";
+ * uint64_t myhash2 = parcHash64_Data_Cumulative(data2,10,myhash1);
+ * char * data3 = "1234567890abcdefghij";
+ * uint64_t myhash3 = parcHash64_Data(data3,20);
+ * // myhash3 will be equal to myhash2
+ *
+ * @endcode
+ *
+ * @see {@link parcHash64_Data}
+ */
+uint64_t parcHash64_Data_Cumulative(const void *data, size_t len, uint64_t lastValue);
+
+/**
+ * Generate a 64 bit hash from a 64 bit Integer
+ *
+ * This function hashes a 64 bit integer into a 64 bit hash
+ *
+ * @param [in] int64 A 64 bit integer
+ *
+ * @return hash64 A 64 bit hash of the 64 bit integer
+ *
+ * Example:
+ * @code
+ * uint64_t id64 = 1234567890123456;
+ * uint64_t hash64 = parcHash64_Int64(id64);
+ * @endcode
+ *
+ */
+uint64_t parcHash64_Int64(uint64_t int64);
+
+/**
+ * Generate a 64 bit hash from a 32 bit Integer
+ *
+ * This function hashes a 32 bit integer into a 64 bit hash
+ *
+ * @param [in] int32 A 32 bit integer
+ *
+ * @return hash64 A 64 bit hash of the 32 bit integer
+ *
+ * Example:
+ * @code
+ * uint32_t id32 = 70;
+ * uint64_t hash64 = parcHash64_Int32(id32);
+ * @endcode
+ *
+ */
+uint64_t parcHash64_Int32(uint32_t int32);
+
+/**
+ * Generate a 32 bit hash from a memory block
+ *
+ * This function will generate a 32bit hash from a block of memory. The memory block
+ * is not modified in any way.
+ * The output of this function can be used as input for the cumulative version of
+ * this function.
+ *
+ * @param [in] data pointer to a memory block.
+ * @param [in] len length of the memory pointed to by data
+ *
+ * @return hash_32bit A 32 bit hash of the memory block.
+ *
+ * Example:
+ * @code
+ *
+ * char * data = "Hello world of hashing";
+ * uint32_t myhash = parcHash32_Data(data,strlen(data));
+ *
+ * @endcode
+ *
+ * @see {@link parcHash32_Data_Cumulative}
+ */
+uint32_t parcHash32_Data(const void *data, size_t len);
+
+/**
+ * Generate a 32 bit hash from a memory block starting with a previous hash
+ *
+ * This function will generate a 32 bit hash from a block of memory and an initial
+ * hash. This is used to cumulatively calculate a hash of larger block. So,
+ * one could generate the hash of the first part of the data (A), then calculate the
+ * hash including the next part of the data (AB) and then the hash of the next
+ * part (ABC). This is useful for not having to recalculate the hash of the parts
+ * you have already hashed.
+ *
+ * A cumulative hash should have the same value as a full hash of the complete data.
+ * So cumulative_hash(B,len(B),hash(A)) is equal to hash(AB,len(AB)).
+ *
+ * @param [in] data pointer to a memory block.
+ * @param [in] len length of the memory pointed to by data
+ * @param [in] lastValue the vale of the last cumulative hash calculated
+ *
+ * @return cumulative_hash32 A 32 bit hash of the data _and_ the data that was
+ * hashed before (represented by lastValue).
+ *
+ * Example:
+ * @code
+ *
+ * char * data1 = "1234567890";
+ * uint32_t myhash1 = parcHash32_Data(data1,10);
+ * char * data2 = "abcdefghij";
+ * uint32_t myhash2 = parcHash32_Data_Cumulative(data2,10,myhash1);
+ * char * data3 = "1234567890abcdefghij";
+ * uint32_t myhash3 = parcHash32_Data(data3,20);
+ * // myhash3 will be equal to myhash2
+ *
+ * @endcode
+ *
+ * @see {@link parcHash32_Data}
+ */
+uint32_t parcHash32_Data_Cumulative(const void *data, size_t len, uint32_t lastValue);
+
+/**
+ * Generate a 32 bit hash from a 64 bit Integer
+ *
+ * This function hashes a 64 bit integer into a 32 bit hash
+ *
+ * @param [in] int64 A 64 bit integer
+ *
+ * @return hash32 A 32 bit hash of the 64 bit integer
+ *
+ * Example:
+ * @code
+ * uint64_t id64 = 1234567890123456;
+ * uint32_t hash32 = parcHash32_Int64(id64);
+ * @endcode
+ *
+ */
+uint32_t parcHash32_Int64(uint64_t int64);
+
+/**
+ * Generate a 32 bit hash from a 32 bit Integer
+ *
+ * This function hashes a 32 bit integer into a 32 bit hash
+ *
+ * @param [in] int32 A 32 bit integer
+ *
+ * @return hash32 A 32 bit hash of the 32 bit integer
+ *
+ * Example:
+ * @code
+ * uint32_t id32 = 1234567890123456;
+ * uint32_t hash32 = parcHash32_Int32(id32);
+ * @endcode
+ *
+ */
+uint32_t parcHash32_Int32(uint32_t int32);
+#endif // libparc_parc_Hash_h