void hashx7(void *state, const void *input, uint64_t timestamp)
{
uint32_t _ALIGN(64) hash[7][16];
uint32_t *hash0 = hash[0];
uint32_t *hash1 = hash[1];
uint32_t *hash2 = hash[2];
uint32_t *hash3 = hash[3];
uint32_t *hash4 = hash[4];
uint32_t *hash5 = hash[5];
uint32_t *hash6 = hash[6];
x7_context_overlay ctx;
// Blake512
sph_blake512_init(&ctx.blake);
sph_blake512(&ctx.blake, ×tamp, sizeof(timestamp));
sph_blake512(&ctx.blake, input, 80);
sph_blake512_close(&ctx.blake, hash0);
// BMW512
sph_bmw512_init(&ctx.bmw);
sph_bmw512(&ctx.bmw, hash0, 64);
sph_bmw512_close(&ctx.bmw, hash1);
// XOR with hash0
for (int i = 0; i < 64; ++i) {
hash1
^= hash0;
}
// groestl
#if defined(__AES__)
groestl512_full(&ctx.groestl, (char*)hash2, (const char*)hash1, 512);
#else
sph_groestl512_init(&ctx.groestl);
sph_groestl512(&ctx.groestl, hash1, 64);
sph_groestl512_close(&ctx.groestl, hash2);
#endif
// Skein512
sph_skein512_init(&ctx.skein);
sph_skein512(&ctx.skein, hash2, 64);
sph_skein512_close(&ctx.skein, hash3);
// XOR with hash2
for (int i = 0; i < 64; ++i) {
hash3 ^= hash2;
}
// Keccak512
sph_keccak512_init(&ctx.keccak);
sph_keccak512(&ctx.keccak, hash3, 64);
sph_keccak512_close(&ctx.keccak, hash4);
#if defined(__aarch64__)
sph_luffa512_init(&ctx.luffa);
sph_luffa512(&ctx.luffa, hash4, 64);
sph_luffa512_close(&ctx.luffa, hash5);
#else
luffa_full(&ctx.luffa, hash5, 512, hash4, 64);
#endif
#if defined(__AES__)
echo_full(&ctx.echo, (BitSequence *)hash6, 512, (const BitSequence *)hash5, 64);
#else
sph_echo512_init(&ctx.echo);
sph_echo512(&ctx.echo, hash5, 64);
sph_echo512_close(&ctx.echo, hash6);
#endif
// XOR with hash5
for (int i = 0; i < 64; ++i) {
hash6 ^= hash5;
}
memcpy(state, hash6, 32);
}
Hello! How does ccminer handle the algorithm with timestamp in sph_blake512(&ctx.blake, ×tamp, sizeof(timestamp)); algorithm?