commit 9ecc827d12d0f917ffbc603b82ca9ac77b29c2a8
parent e8ef6843fcc847a1baf80f3a2324b701e7dbf50a
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Mon, 5 Sep 2022 14:30:15 +0200
Add and test the sars_band_compute_hash function
Diffstat:
3 files changed, 63 insertions(+), 5 deletions(-)
diff --git a/src/sars.c b/src/sars.c
@@ -437,6 +437,45 @@ error:
}
res_T
+sars_band_compute_hash
+ (const struct sars* sars,
+ const size_t iband,
+ hash256_T hash)
+{
+ struct darray_char bytes;
+ struct sars_band band;
+ res_T res = RES_OK;
+
+ if(!sars || !hash) return RES_BAD_ARG;
+
+ darray_char_init(sars->allocator, &bytes);
+
+ res = sars_get_band(sars, iband, &band);
+ if(res != RES_OK) goto error;
+
+ #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(&band.lower, 1);
+ WRITE(&band.upper, 1);
+ WRITE(&band.id, 1);
+ WRITE(band.k_list, sars->nnodes);
+ #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;
+}
+
+res_T
sars_compute_hash(const struct sars* sars, hash256_T hash)
{
struct darray_char bytes;
@@ -459,11 +498,10 @@ sars_compute_hash(const struct sars* sars, hash256_T hash)
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));
+ hash256_T hash_band;
+ res = sars_band_compute_hash(sars, i, hash_band);
+ if(res != RES_OK) goto error;
+ WRITE(hash_band, sizeof(hash256_T));
}
#undef WRITE
diff --git a/src/sars.h b/src/sars.h
@@ -114,6 +114,12 @@ sars_find_bands
size_t ibands[2]); /* Range of overlaped bands. Limits are inclusive */
SARS_API res_T
+sars_band_compute_hash
+ (const struct sars* sars,
+ const size_t iband,
+ hash256_T hash);
+
+SARS_API res_T
sars_compute_hash
(const struct sars* sars,
hash256_T hash);
diff --git a/src/test_sars_load.c b/src/test_sars_load.c
@@ -112,6 +112,8 @@ test_load(struct sars* sars)
{
hash256_T hash0;
hash256_T hash1;
+ hash256_T band_hash0;
+ hash256_T band_hash1;
FILE* fp = NULL;
const char* filename = "test_file.sars";
const uint64_t pagesize = 16384;
@@ -134,6 +136,15 @@ test_load(struct sars* sars)
CHK(sars_compute_hash(sars, NULL) == RES_BAD_ARG);
CHK(sars_compute_hash(sars, hash0) == RES_OK);
+ CHK(sars_band_compute_hash(NULL, 0, band_hash0) == RES_BAD_ARG);
+ CHK(sars_band_compute_hash(sars, nbands, band_hash0) == RES_BAD_ARG);
+ CHK(sars_band_compute_hash(sars, 0, NULL) == RES_BAD_ARG);
+ CHK(sars_band_compute_hash(sars, 0, band_hash0) == RES_OK);
+ CHK(!hash256_eq(hash0, band_hash0));
+
+ CHK(sars_band_compute_hash(sars, 0, band_hash1) == RES_OK);
+ CHK(hash256_eq(band_hash0, band_hash1));
+
CHK(sars_load(NULL, filename) == RES_BAD_ARG);
CHK(sars_load(sars, NULL) == RES_BAD_ARG);
CHK(sars_load(sars, "nop") == RES_IO_ERR);
@@ -151,6 +162,9 @@ test_load(struct sars* sars)
CHK(sars_compute_hash(sars, hash1) == RES_OK);
CHK(!hash256_eq(hash0, hash1));
+ CHK(sars_band_compute_hash(sars, 0, band_hash1) == RES_OK);
+ CHK(hash256_eq(band_hash0, band_hash1));
+
CHK(fclose(fp) == 0);
}