commit a5abd4ad73123c4e578f0ae6adfc36271a162c4f
parent e6b00a716ea586ba8c263b1afcdccf3fcc9fc5b8
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Mon, 5 Sep 2022 14:48:47 +0200
Add hash functions
Diffstat:
| M | src/sck.c | | | 123 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| M | src/sck.h | | | 18 | ++++++++++++++++++ |
2 files changed, 141 insertions(+), 0 deletions(-)
diff --git a/src/sck.c b/src/sck.c
@@ -23,6 +23,7 @@
#include "sck_log.h"
#include <rsys/algorithm.h>
+#include <rsys/dynamic_array_char.h>
#include <unistd.h> /* sysconf support */
@@ -568,6 +569,128 @@ sck_band_sample_quad_pt
return RES_OK;
}
+res_T
+sck_quad_pt_compute_hash
+ (const struct sck_band* band,
+ const size_t iquad_pt,
+ hash256_T hash)
+{
+ struct darray_char bytes;
+ struct sck_quad_pt quad_pt;
+ res_T res = RES_OK;
+
+ if(!band || !hash) return RES_BAD_ARG;
+
+ darray_char_init(band->sck__->allocator, &bytes);
+
+ res = sck_band_get_quad_pt(band, iquad_pt, &quad_pt);
+ 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(&quad_pt.weight, 1);
+ WRITE(&quad_pt.id, 1);
+ WRITE(quad_pt.ka_list, band->sck__->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
+sck_band_compute_hash
+ (const struct sck* sck,
+ const size_t iband,
+ hash256_T hash)
+{
+ struct darray_char bytes;
+ struct sck_band band;
+ size_t iquad_pt;
+ res_T res = RES_OK;
+
+ if(!sck || !hash) return RES_BAD_ARG;
+
+ darray_char_init(sck->allocator, &bytes);
+
+ res = sck_get_band(sck, 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.quad_pts_count, 1);
+ WRITE(&band.id, 1);
+ WRITE(band.ks_list, sck->nnodes);
+ FOR_EACH(iquad_pt, 0, band.quad_pts_count) {
+ hash256_T quad_pt_hash;
+ res = sck_quad_pt_compute_hash(&band, iquad_pt, quad_pt_hash);
+ if(res != RES_OK) goto error;
+ WRITE(quad_pt_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;
+}
+
+res_T
+sck_compute_hash(const struct sck* sck, hash256_T hash)
+{
+ struct darray_char bytes;
+ size_t iband;
+ res_T res = RES_OK;
+
+ if(!sck || !hash) return RES_BAD_ARG;
+
+ darray_char_init(sck->allocator, &bytes);
+
+ #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(&sck->pagesize, 1);
+ WRITE(&sck->nnodes, 1);
+ FOR_EACH(iband, 0, darray_band_size_get(&sck->bands)) {
+ hash256_T band_hash;
+ res = sck_band_compute_hash(sck, iband, band_hash);
+ if(res != RES_OK) goto error;
+ WRITE(band_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/sck.h b/src/sck.h
@@ -17,6 +17,7 @@
#ifndef SCK_H
#define SCK_H
+#include <rsys/hash.h>
#include <rsys/rsys.h>
/* Library symbol management */
@@ -131,6 +132,23 @@ sck_band_sample_quad_pt
const double r, /* Canonical random number in [0, 1[ */
struct sck_quad_pt* quad_pt);
+SCK_API res_T
+sck_quad_pt_compute_hash
+ (const struct sck_band* band,
+ const size_t iquad_pt,
+ hash256_T hash);
+
+SCK_API res_T
+sck_band_compute_hash
+ (const struct sck* sck,
+ const size_t iband,
+ hash256_T hash);
+
+SCK_API res_T
+sck_compute_hash
+ (const struct sck* sck,
+ hash256_T hash);
+
END_DECLS
#endif /* SCK_H */