star-ck

Describe the radiative properties of gas mixtures
git clone git://git.meso-star.fr/star-ck.git
Log | Files | Refs | README | LICENSE

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:
Msrc/sck.c | 123+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/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 */