commit e8ef6843fcc847a1baf80f3a2324b701e7dbf50a
parent 3da21deaf0f1cbda2f8e360e34a72d93c9b81239
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 31 Aug 2022 17:48:17 +0200
Add and test the sars_compute_hash function
Diffstat:
3 files changed, 69 insertions(+), 0 deletions(-)
diff --git a/src/sars.c b/src/sars.c
@@ -22,6 +22,8 @@
#include "sars_log.h"
#include <rsys/algorithm.h>
+#include <rsys/dynamic_array_char.h>
+#include <rsys/hash.h>
#include <unistd.h> /* sysconf support */
@@ -434,6 +436,46 @@ error:
goto exit;
}
+res_T
+sars_compute_hash(const struct sars* sars, hash256_T hash)
+{
+ struct darray_char bytes;
+ size_t i;
+ res_T res = RES_OK;
+
+ if(!sars || !hash) return RES_BAD_ARG;
+
+ darray_char_init(sars->allocator, &bytes);
+
+ /* Write data to hash */
+ #define WRITE(Var, Nb) { \
+ size_t ibyte; \
+ FOR_EACH(ibyte, 0, sizeof(*Var)*(Nb)) { \
+ res = darray_char_push_back(&bytes, ((const char*)Var)+ibyte); \
+ if(res != RES_OK) goto error; \
+ } \
+ } (void)0
+
+ WRITE(&sars->pagesize, 1);
+ WRITE(&sars->nnodes, 1);
+ FOR_EACH(i, 0, darray_band_size_get(&sars->bands)) {
+ const struct band* band = darray_band_cdata_get(&sars->bands) + i;
+ hash_sha256(band->k_list, sars->nnodes*sizeof(float), hash);
+ WRITE(&band->low, 1);
+ WRITE(&band->upp, 1);
+ WRITE(hash, sizeof(hash256_T));
+ }
+ #undef WRITE
+
+ hash_sha256(darray_char_cdata_get(&bytes), darray_char_size_get(&bytes), hash);
+
+exit:
+ darray_char_release(&bytes);
+ return res;
+error:
+ goto exit;
+}
+
/*******************************************************************************
* Local functions
******************************************************************************/
diff --git a/src/sars.h b/src/sars.h
@@ -16,6 +16,7 @@
#ifndef SARS_H
#define SARS_H
+#include <rsys/hash.h>
#include <rsys/rsys.h>
/* Library symbol management */
@@ -112,6 +113,11 @@ sars_find_bands
const double range[2], /* In nm. Limits are inclusive */
size_t ibands[2]); /* Range of overlaped bands. Limits are inclusive */
+SARS_API res_T
+sars_compute_hash
+ (const struct sars* sars,
+ hash256_T hash);
+
static INLINE float
sars_band_get_ka(const struct sars_band* band, const size_t inode)
{
diff --git a/src/test_sars_load.c b/src/test_sars_load.c
@@ -16,6 +16,7 @@
#define _POSIX_C_SOURCE 200112L /* nextarfter */
#include "sars.h"
+#include <rsys/hash.h>
#include <rsys/mem_allocator.h>
#include <math.h>
@@ -109,6 +110,8 @@ write_sars
static void
test_load(struct sars* sars)
{
+ hash256_T hash0;
+ hash256_T hash1;
FILE* fp = NULL;
const char* filename = "test_file.sars";
const uint64_t pagesize = 16384;
@@ -127,12 +130,27 @@ test_load(struct sars* sars)
rewind(fp);
CHK(sars_load_stream(sars, fp, filename) == RES_OK);
+ CHK(sars_compute_hash(NULL, hash0) == RES_BAD_ARG);
+ CHK(sars_compute_hash(sars, NULL) == RES_BAD_ARG);
+ CHK(sars_compute_hash(sars, hash0) == RES_OK);
+
CHK(sars_load(NULL, filename) == RES_BAD_ARG);
CHK(sars_load(sars, NULL) == RES_BAD_ARG);
CHK(sars_load(sars, "nop") == RES_IO_ERR);
CHK(sars_load(sars, filename) == RES_OK);
check_sars_load(sars, nbands, nnodes);
+ CHK(sars_compute_hash(sars, hash1) == RES_OK);
+ CHK(hash256_eq(hash0, hash1));
+
+ rewind(fp);
+ write_sars(fp, pagesize, nbands+1, nnodes);
+ rewind(fp);
+
+ CHK(sars_load_stream(sars, fp, filename) == RES_OK);
+ CHK(sars_compute_hash(sars, hash1) == RES_OK);
+ CHK(!hash256_eq(hash0, hash1));
+
CHK(fclose(fp) == 0);
}
@@ -218,6 +236,7 @@ test_load_files(struct sars* sars, int argc, char** argv)
int i;
CHK(sars);
FOR_EACH(i, 1, argc) {
+ hash256_T hash;
size_t nnodes;
size_t nbands;
size_t iband;
@@ -250,6 +269,8 @@ test_load_files(struct sars* sars, int argc, char** argv)
CHK(ks == ks); /* !NaN */
}
}
+
+ CHK(sars_compute_hash(sars, hash) == RES_OK);
}
}