ec

作者: 滩主 | 来源:发表于2020-07-04 15:59 被阅读0次

    https://blog.openacid.com/storage/ec-2/

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <getopt.h>
    #include "erasure_code.h"   // use <isa-l.h> instead when linking against installed
    
    #define MMAX 255
    #define KMAX 255
    
    typedef unsigned char u8;
    
    // 计算指定的校验块
    void ec_encode_data_spec(int len, int srcs, int dest_i,
                        unsigned char *v,unsigned char **src,
                        unsigned char *dest)
    {
        int i, j;
        unsigned char s;
    
        for (i = 0; i < len; i++) {
            s = 0;
          for (j = 0; j < srcs; j++) {
            s ^= gf_mul(src[j][i], v[j * 32 + dest_i * srcs * 32 + 1]);
            dest[i] = s;
                }
        }
    }
    
    // 计算增量校验块
    void ec_encode_data_delta_spec(int len, int k, int vec_i,
                                                int dest_i, unsigned char *v,
                                unsigned char *data,
                                unsigned char *dest)
    {
        int i;
        for (i = 0; i < len; i++) {
           dest[i] = gf_mul(data[i], v[vec_i * 32 + dest_i * k * 32 + 1]);
        }
    }
    
    // 计算增量校验块并更新
    void ec_encode_data_update_spec(int len, int k, int vec_i,
                                                int dest_i, unsigned char *v,
                                unsigned char *data,
                                unsigned char *dest)
    {
        int i;
        unsigned char s;
    
        for (i = 0; i < len; i++) {
           s = dest[i];
           s ^= gf_mul(data[i], v[vec_i * 32 + dest_i * k * 32 + 1]);
           dest[i] = s;
        }
    }
    
    int main(int argc, char *argv[])
    {
        u8 *frag_ptrs[MMAX];
        u8 *encode_matrix;
        u8 *g_tbls;
      int k = 4,p =2;
        int m = k + p;
      int len =5;
        encode_matrix = malloc(m * k);
        g_tbls = malloc(k * p * 32);
    
        for (int i = 0; i < m; i++) {
            if (NULL == (frag_ptrs[i] = malloc(len))) {
                printf("alloc error: Fail\n");
                return -1;
            }
        }
    
        for (int i = 0; i < k; i++)
            for (int j = 0; j < len; j++)
                frag_ptrs[i][j] = i+1;
    
        printf(" encode (m,k,p)=(%d,%d,%d) len=%d\n", m, k, p, len);
    
        gf_gen_rs_matrix(encode_matrix, m, k);
      for (int i=0;i<m;i++) {
            for (int j=0;j<k;j++) {
                printf("%d ",encode_matrix[i*k+j]);
        }
            printf("\n");
      }
      printf("-------------------\n");
        // Initialize g_tbls from encode matrix
        ec_init_tables(k, p, &encode_matrix[k * k], g_tbls);
    
    
      printf("ec encode\n");
      printf("------------------\n");
        // Generate EC parity blocks from sources
        ec_encode_data(len, k, p, g_tbls, frag_ptrs, &frag_ptrs[k]);
    
      for (int i = 0; i < m; i++) {
        for (int j = 0; j < len; j++)
            printf("%d ",frag_ptrs[i][j]);
        printf("\n");
        }
    
        u8* old_delta_ec = malloc(p*len);
      for (int i=0;i<p;i++) {
            ec_encode_data_delta_spec(len,k,0,i,g_tbls,frag_ptrs[0],&old_delta_ec[i*len]);
        }
        printf("change data--------------\n");
      for (int i=0;i<len;i++) {
            frag_ptrs[0][i] *= 10;
        }
        for (int i=0;i<k;i++) {
            for (int j=0;j<len;j++) {
                printf("%d ",frag_ptrs[i][j]);
            }
            printf("\n");
        }
    
        u8* new_delta_ec = malloc(p*len);
      for (int i=0;i<p;i++) {
            ec_encode_data_delta_spec(len,k,0,i,g_tbls,frag_ptrs[0],&new_delta_ec[i*len]);
        }
      printf("encode delta-------------------\n");
      for (int j=0;j<p;j++) {
            for (int i=0;i<len;i++) {
                printf("%d ",frag_ptrs[k+j][i]^old_delta_ec[j*len+i]^new_delta_ec[j*len+i]);
            }
            printf("\n");
        }
    
    
      printf("encode update--------------\n");
        for (int i=0;i<p;i++) {
        ec_encode_data_update_spec(len,k,0,i,g_tbls,frag_ptrs[0],frag_ptrs[k+i]);
        }
      for (int i = 0; i < p; i++) {
        for (int j = 0; j < len; j++)
            printf("%d ",frag_ptrs[k+i][j] ^ old_delta_ec[i*len+j]);
        printf("\n");
        }
    
      printf("re encode-----------\n");
        ec_encode_data(len, k, p, g_tbls, frag_ptrs, &frag_ptrs[k]);
    
      for (int i = 0; i < m; i++) {
        for (int j = 0; j < len; j++)
            printf("%d ",frag_ptrs[i][j]);
        printf("\n");
        }
    }
    

    相关文章

      网友评论

          本文标题:ec

          本文链接:https://www.haomeiwen.com/subject/dxvuqktx.html