This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
tango-maat/src/entry/zt_hash.h

235 lines
238 KiB
C
Raw Normal View History

#include<stdio.h>
#include<stdlib.h>
struct zt_state_t
{
union
{
unsigned char matrix[4]; //strong hash state
unsigned int val;
};
};
const unsigned char table[256][4] =
{
{76,28,128,81},{76,204,128,209},{204,128,209,81},{204,76,209,128},{238,209,196,115},{238,63,196,183},{63,209,183,115},{63,238,183,196},{230,196,193,123},{230,34,193,186},{34,196,186,123},{34,230,186,193},{0,183,175,76},{0,183,175,227},{183,183,227,76},{183,0,227,175},{228,193,192,121},{228,37,192,185},{37,193,185,121},{37,228,185,192},{18,186,164,75},{18,168,164,239},{168,186,239,75},{168,18,239,164},{15,175,169,67},{15,160,169,234},{160,175,234,67},{160,15,234,169},{151,227,247,108},{151,116,247,155},{116,227,155,108},{116,151,155,247},{228,192,193,121},{228,36,193,184},{36,192,184,121},{36,228,184,193},{22,185,167,74},{22,175,167,237},{175,185,237,74},{175,22,237,167},{30,164,162,71},{30,186,162,229},{186,164,229,71},{186,30,229,162},{136,239,250,107},{136,103,250,145},{103,239,145,107},{103,136,145,250},{12,169,169,64},{12,165,169,233},{165,169,233,64},{165,12,233,169},{138,234,251,105},{138,96,251,146},{96,234,146,105},{96,138,146,251},{159,247,243,100},{159,104,243,151},{104,247,151,100},{104,159,151,243},{71,155,133,95},{71,220,133,218},{220,155,218,95},{220,71,218,133},{230,193,196,123},{230,39,196,191},{39,193,191,123},{39,230,191,196},{20,184,160,73},{20,172,160,233},{172,184,233,73},{172,20,233,160},{25,167,167,69},{25,190,167,226},{190,167,226,69},{190,25,226,167},{141,237,253,104},{141,96,253,149},{96,237,149,104},{96,141,149,253},{30,162,164,71},{30,188,164,227},{188,162,227,71},{188,30,227,164},{144,229,240,109},{144,117,240,157},{117,229,157,109},{117,144,157,240},{130,250,251,97},{130,120,251,154},{120,250,154,97},{120,130,154,251},{84,145,137,88},{84,197,137,209},{197,145,209,88},{197,84,209,137},{15,169,175,67},{15,166,175,236},{166,169,236,67},{166,15,236,175},{143,233,253,106},{143,102,253,151},{102,233,151,106},{102,143,151,253},{130,251,250,97},{130,121,250,155},{121,251,155,97},{121,130,155,250},{80,146,138,89},{80,194,138,211},{194,146,211,89},{194,80,211,138},{159,243,247,100},{159,108,247,147},{108,243,147,100},{108,159,147,247},{87,151,137,91},{87,192,137,210},{192,151,210,91},{192,87,210,137},{72,133,133,80},{72,205,133,213},{205,133,213,80},{205,72,213,133},{246,218,207,117},{246,44,207,186},{44,218,186,117},{44,246,186,207},{238,196,209,115},{238,42,209,162},{42,196,162,115},{42,238,162,209},{24,191,191,68},{24,167,191,251},{167,191,251,68},{167,24,251,191},{20,160,184,73},{20,180,184,241},{180,160,241,73},{180,20,241,184},{134,233,236,99},{134,111,236,143},{111,233,143,99},{111,134,143,236},{22,167,185,74},{22,177,185,243},{177,167,243,74},{177,22,243,185},{156,226,227,103},{156,126,227,132},{126,226,132,103},{126,156,132,227},{143,253,233,106},{143,114,233,131},{114,253,131,106},{114,143,131,233},{95,149,147,87},{95,202,147,196},{202,149,196,87},{202,95,196,147},{18,164,186,75},{18,182,186,241},{182,164,241,75},{182,18,241,186},{156,227,226,103},{156,127,226,133},{127,227,133,103},{127,156,133,226},{144,240,229,109},{144,96,229,136},{96,240,136,109},{96,144,136,229},{74,157,155,82},{74,215,155,201},{215,157,201,82},{215,74,201,155},{138,251,234,105},{138,113,234,131},{113,251,131,105},{113,138,131,234},{72,154,154,81},{72,210,154,203},{210,154,203,81},{210,72,203,154},{87,137,151,91},{87,222,151,204},{222,137,204,91},{222,87,204,151},{231,209,213,122},{231,54,213,175},{54,209,175,122},{54,231,175,213},{0,175,183,76},{0,175,183,251},{175,175,251,76},{175,0,251,183},{134,236,233,99},{134,106,233,138},{106,236,138,99},{106,134,138,233},{141,253,237,104},{141,112,237,133},{112,253,133,104},{112,141,133,237},{89,151,151,85},{89,206,151,194},{206,151,194,85},{206,89,194,151},{136,250,239,107},{136,114,239,132},{114,250,132,107},{114,136,132,239},{74,155,157,82},{74,209,157,207},{209,155,207,82},{209,74,207,157},{80,138,146,89},{80,218,146,203},{218,138,203,89},{218,80,203,146},{226,211,210,121},{226,49,210,171},{49,211,171,121},{49,226,171,210},{151,247,227,108},{151,96,227,143},{96,247,143,108},{96,151,143,227},{95,147,149,87},{95,204,149,194},{204,147,194,87},{204,95,194,149},{84,137,145,88},{84,221,145,201},{221,137,201,88},{221,84,201,145},{226,210,211,121},{226,48,211,170},{48,210,170,121
};
const static unsigned char galois_mult_8_table[65536] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200,202,204,206,208,210,212,214,216,218,220,222,224,226,228,230,232,234,236,238,240,242,244,246,248,250,252,254,29,31,25,27,21,23,17,19,13,15,9,11,5,7,1,3,61,63,57,59,53,55,49,51,45,47,41,43,37,39,33,35,93,95,89,91,85,87,81,83,77,79,73,75,69,71,65,67,125,127,121,123,117,119,113,115,109,111,105,107,101,103,97,99,157,159,153,155,149,151,145,147,141,143,137,139,133,135,129,131,189,191,185,187,181,183,177,179,173,175,169,171,165,167,161,163,221,223,217,219,213,215,209,211,205,207,201,203,197,199,193,195,253,255,249,251,245,247,241,243,237,239,233,235,229,231,225,227,0,3,6,5,12,15,10,9,24,27,30,29,20,23,18,17,48,51,54,53,60,63,58,57,40,43,46,45,36,39,34,33,96,99,102,101,108,111,106,105,120,123,126,125,116,119,114,113,80,83,86,85,92,95,90,89,72,75,78,77,68,71,66,65,192,195,198,197,204,207,202,201,216,219,222,221,212,215,210,209,240,243,246,245,252,255,250,249,232,235,238,237,228,231,226,225,160,163,166,165,172,175,170,169,184,187,190,189,180,183,178,177,144,147,150,149,156,159,154,153,136,139,142,141,132,135,130,129,157,158,155,152,145,146,151,148,133,134,131,128,137,138,143,140,173,174,171,168,161,162,167,164,181,182,179,176,185,186,191,188,253,254,251,248,241,242,247,244,229,230,227,224,233,234,239,236,205,206,203,200,193,194,199,196,213,214,211,208,217,218,223,220,93,94,91,88,81,82,87,84,69,70,67,64,73,74,79,76,109,110,107,104,97,98,103,100,117,118,115,112,121,122,127,124,61,62,59,56,49,50,55,52,37,38,35,32,41,42,47,44,13,14,11,8,1,2,7,4,21,22,19,16,25,26,31,28,0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252,29,25,21,17,13,9,5,1,61,57,53,49,45,41,37,33,93,89,85,81,77,73,69,65,125,121,117,113,109,105,101,97,157,153,149,145,141,137,133,129,189,185,181,177,173,169,165,161,221,217,213,209,205,201,197,193,253,249,245,241,237,233,229,225,58,62,50,54,42,46,34,38,26,30,18,22,10,14,2,6,122,126,114,118,106,110,98,102,90,94,82,86,74,78,66,70,186,190,178,182,170,174,162,166,154,158,146,150,138,142,130,134,250,254,242,246,234,238,226,230,218,222,210,214,202,206,194,198,39,35,47,43,55,51,63,59,7,3,15,11,23,19,31,27,103,99,111,107,119,115,127,123,71,67,79,75,87,83,95,9
/*
** this function is used to create galois_mult_8_table[65536]
*/
/*int galois_create_mult_tables(int w)
int j, x, y, logx;
if (w >= 14) return -1;
if (galois_mult_tables[w] != NULL) return 0;
galois_mult_tables[w] = (int *) malloc(sizeof(int) * nw[w] * nw[w]);
if (galois_mult_tables[w] == NULL) return -1;
galois_div_tables[w] = (int *) malloc(sizeof(int) * nw[w] * nw[w]);
if (galois_div_tables[w] == NULL) {
free(galois_mult_tables[w]);
galois_mult_tables[w] = NULL;
return -1;
}
if (galois_log_tables[w] == NULL) {
if (galois_create_log_tables(w) < 0) {
free(galois_mult_tables[w]);
free(galois_div_tables[w]);
galois_mult_tables[w] = NULL;
galois_div_tables[w] = NULL;
return -1;
}
}
j = 0;
galois_mult_tables[w][j] = 0;
galois_div_tables[w][j] = -1;
j++;
for (y = 1; y < nw[w]; y++) {
galois_mult_tables[w][j] = 0;
galois_div_tables[w][j] = 0;
j++;
}
for (x = 1; x < nw[w]; x++) {
galois_mult_tables[w][j] = 0;
galois_div_tables[w][j] = -1;
j++;
logx = galois_log_tables[w][x];
for (y = 1; y < nw[w]; y++) {
galois_mult_tables[w][j] = galois_ilog_tables[w][logx+galois_log_tables[w][y]];
galois_div_tables[w][j] = galois_ilog_tables[w][logx-galois_log_tables[w][y]];
j++;
}
}
FILE * fp;
fp = fopen("/home/lixiang/zt_hash/table_result.txt","a");
int i = 0;
fprintf(fp, "mult_tables:\n");
for(i = 0; i < nw[w]*nw[w]; i++)
{
fprintf(fp, "%d,", galois_mult_tables[w][i]);
}
fprintf(fp, "\ndiv_tables:\n");
for(i = 0; i < nw[w]*nw[w]; i++)
{
fprintf(fp, "%d,", galois_div_tables[w][i]);
}
fprintf(fp, "\nlog_tables:\n");
for(i = 0; i < nw[w]; i++)
{
fprintf(fp, "%d,", galois_log_tables[w][i]);
}
fprintf(fp, "\nilog_tables:\n");
for(i = 0; i < nw[w]*3; i++)
{
fprintf(fp, "%d,", galois_ilog_tables[w][i]);
}
fclose(fp);
return 0;
}
*/
#define galois_multtable_8_multiply(x,y) galois_mult_8_table[((x)<<8)|(y)]
/*
inline unsigned char galois_multtable_8_multiply(unsigned char x, unsigned char y)
{
int index = (x<<8) | y;
return galois_mult_8_table[index];
}
*/
/*int galois_destroy_mult_tables(int w)
{
return 0;
}*/
static inline void zt_hash_arymul(struct zt_state_t * a, struct zt_state_t* b)
{
struct zt_state_t tmp;
tmp.val=a->val;
a->matrix[0] = galois_multtable_8_multiply(tmp.matrix[0],b->matrix[0])^galois_multtable_8_multiply(tmp.matrix[1],b->matrix[2]);
a->matrix[1] = galois_multtable_8_multiply(tmp.matrix[0],b->matrix[1])^galois_multtable_8_multiply(tmp.matrix[1],b->matrix[3]);
a->matrix[2] = galois_multtable_8_multiply(tmp.matrix[2],b->matrix[0])^galois_multtable_8_multiply(tmp.matrix[3],b->matrix[2]);
a->matrix[3] = galois_multtable_8_multiply(tmp.matrix[2],b->matrix[1])^galois_multtable_8_multiply(tmp.matrix[3],b->matrix[3]);
}
/*
** this function is used to create the table[4][256]
*/
/*void convert(int number, unsigned char * ret)
{
int i,a[8];
unsigned char tmp[4];
for(i = 0; i < 8; i++)
{
a[i] = number%2;
number = number/2;
}
if(a[7] == 0)
{
ret[0] = 2;
ret[1] = 1;
ret[2] = 1;
ret[3] = 0;
}
else
{
ret[0] = 2;
ret[1] = 3;
ret[2] = 1;
ret[3] = 1;
}
for(i = 6; i >= 0; i--)
{
if(a[i] == 0)
{
tmp[0] = 2;
tmp[1] = 1;
tmp[2] = 1;
tmp[3] = 0;
}
else
{
tmp[0] = 2;
tmp[1] = 3;
tmp[2] = 1;
tmp[3] = 1;
}
zt_hash_arymul(ret, tmp);
}
}*/
/*
** this function is used to create table[4][256]
*/
/*void zt_hash_create_table()
{
unsigned char ret[4]={0};
int i = 0;
FILE * fp;
fp = fopen("/home/lixiang/zt_hash/table.txt","a");
//galois_create_mult_tables(8); //it should not be a comment
for(i = 0; i < 256; i++)
{
convert(i, ret);
table[i].matrix[0] = ret[0];
table[i].matrix[1] = ret[1];
table[i].matrix[2] = ret[2];
table[i].matrix[3] = ret[3];
fprintf(fp, "{%d,%d,%d,%d},", table[i].matrix[0],
table[i].matrix[1],
table[i].matrix[2],
table[i].matrix[3]);
}
}
void zt_hash_destroy_table()
{
int i = 0;
for(i = 0; i < 33; i++)
{
galois_destroy_mult_tables(i);
}
}*/
inline void zt_hash(struct zt_state_t* array, unsigned char c)
{
zt_hash_arymul(array, (struct zt_state_t *)(table[c]));
}
unsigned char ZT_INIT_VAL[4]={1,0,0,1};
void zt_hash_initial(struct zt_state_t* zt_val)
{
zt_val->matrix[0] = 1;
zt_val->matrix[1] = 0;
zt_val->matrix[2] = 0;
zt_val->matrix[3] = 1;
}
int zt_hash_code(struct zt_state_t* zt_val)
{
int ret;
int tmp[4];
tmp[0] = zt_val->matrix[0];
tmp[1] = zt_val->matrix[1]<<8;
tmp[2] = zt_val->matrix[2]<<16;
tmp[3] = zt_val->matrix[3]<<24;
ret = tmp[0]^tmp[1]^tmp[2]^tmp[3];
return ret;
}