Пример #1
0
static void _BRRMDCompress(uint32_t *r, uint32_t *x)
{
    // left line
    static const int rl1[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, // round 1, id
                     rl2[] = { 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8 }, // round 2, rho
                     rl3[] = { 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12 }, // round 3, rho^2
                     rl4[] = { 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2 }, // round 4, rho^3
                     rl5[] = { 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13 }; // round 5, rho^4
    // right line
    static const int rr1[] = { 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12 }, // round 1, pi
                     rr2[] = { 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2 }, // round 2, rho pi
                     rr3[] = { 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13 }, // round 3, rho^2 pi
                     rr4[] = { 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14 }, // round 4, rho^3 pi
                     rr5[] = { 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11 }; // round 5, rho^4 pi
    // left line shifts
    static const int sl1[] = { 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8 }, // round 1
                     sl2[] = { 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12 }, // round 2
                     sl3[] = { 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5 }, // round 3
                     sl4[] = { 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12 }, // round 4
                     sl5[] = { 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 }; // round 5
    // right line shifts
    static const int sr1[] = { 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6 }, // round 1
                     sr2[] = { 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11 }, // round 2
                     sr3[] = { 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5 }, // round 3
                     sr4[] = { 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8 }, // round 4
                     sr5[] = { 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 }; // round 5

    int i;
    uint32_t al = r[0], bl = r[1], cl = r[2], dl = r[3], el = r[4], ar = al, br = bl, cr = cl, dr = dl, er = el, t;
    
    for (i = 0; i < 16; i++) rmd(t, f(bl, cl, dl), x[rl1[i]], 0x00000000, sl1[i], al, el, dl, cl, bl); // round 1 left
    for (i = 0; i < 16; i++) rmd(t, j(br, cr, dr), x[rr1[i]], 0x50a28be6, sr1[i], ar, er, dr, cr, br); // round 1 right
    for (i = 0; i < 16; i++) rmd(t, g(bl, cl, dl), x[rl2[i]], 0x5a827999, sl2[i], al, el, dl, cl, bl); // round 2 left
    for (i = 0; i < 16; i++) rmd(t, i(br, cr, dr), x[rr2[i]], 0x5c4dd124, sr2[i], ar, er, dr, cr, br); // round 2 right
    for (i = 0; i < 16; i++) rmd(t, h(bl, cl, dl), x[rl3[i]], 0x6ed9eba1, sl3[i], al, el, dl, cl, bl); // round 3 left
    for (i = 0; i < 16; i++) rmd(t, h(br, cr, dr), x[rr3[i]], 0x6d703ef3, sr3[i], ar, er, dr, cr, br); // round 3 right
    for (i = 0; i < 16; i++) rmd(t, i(bl, cl, dl), x[rl4[i]], 0x8f1bbcdc, sl4[i], al, el, dl, cl, bl); // round 4 left
    for (i = 0; i < 16; i++) rmd(t, g(br, cr, dr), x[rr4[i]], 0x7a6d76e9, sr4[i], ar, er, dr, cr, br); // round 4 right
    for (i = 0; i < 16; i++) rmd(t, j(bl, cl, dl), x[rl5[i]], 0xa953fd4e, sl5[i], al, el, dl, cl, bl); // round 5 left
    for (i = 0; i < 16; i++) rmd(t, f(br, cr, dr), x[rr5[i]], 0x00000000, sr5[i], ar, er, dr, cr, br); // round 5 right
    
    t = r[1] + cl + dr; // final result for r[0]
    r[1] = r[2] + dl + er, r[2] = r[3] + el + ar, r[3] = r[4] + al + br, r[4] = r[0] + bl + cr, r[0] = t; // combine
    var_clean(&al, &bl, &cl, &dl, &el, &ar, &br, &cr, &dr, &er, &t);
}
TEST(IndexMetaDataTest, writeReadTest) {
    vector<BlockMetaData> bs;
    off_t afterFI =  6 * 2 * sizeof(Id);
    off_t afterLhs = afterFI + 4 * (sizeof(Id) + sizeof(off_t));
    off_t afterRhs = afterLhs + 6 * sizeof(Id);
    bs.push_back(BlockMetaData(10, afterFI));
    bs.push_back(BlockMetaData(16, afterFI + 2 * (sizeof(Id) + sizeof(off_t))));
    RelationMetaData rmd(1, 0, afterLhs, afterRhs, 6, 2, bs);
    RelationMetaData rmd2(rmd);
    rmd2._relId = 2;
    IndexMetaData imd;
    imd.add(rmd);
    imd.add(rmd2);

    ad_utility::File f("_testtmp.imd", "w");
    f << imd;
    f.close();

    ad_utility::File in("_testtmp.imd", "r");
    size_t imdBytes = sizeof(size_t) + rmd.bytesRequired() * 2;
    unsigned char* buf = new unsigned char[imdBytes];
    in.read(buf, imdBytes);
    IndexMetaData imd2;
    imd2.createFromByteBuffer(buf);
    delete[] buf;
    remove("_testtmp.rmd");

    ASSERT_EQ(rmd._relId, imd2.getRmd(1)._relId);
    ASSERT_EQ(rmd._startFullIndex, imd2.getRmd(1)._startFullIndex);
    ASSERT_EQ(rmd._startRhs, imd2.getRmd(1)._startRhs);
    ASSERT_EQ(rmd._offsetAfter, imd2.getRmd(1)._offsetAfter);
    ASSERT_EQ(rmd._nofElements, imd2.getRmd(1)._nofElements);
    ASSERT_EQ(rmd._nofBlocks, imd2.getRmd(1)._nofBlocks);
    ASSERT_EQ(rmd._blocks.size(), imd2.getRmd(1)._blocks.size());
    ASSERT_EQ(rmd._blocks[0]._firstLhs, imd2.getRmd(1)._blocks[0]._firstLhs);
    ASSERT_EQ(rmd._blocks[0]._startOffset, imd2.getRmd(1)._blocks[0]._startOffset);
    ASSERT_EQ(rmd._blocks[1]._firstLhs, imd2.getRmd(1)._blocks[1]._firstLhs);
    ASSERT_EQ(rmd._blocks[1]._startOffset, imd2.getRmd(1)._blocks[1]._startOffset);

    ASSERT_EQ(rmd2._relId, imd2.getRmd(2)._relId);
    ASSERT_EQ(rmd2._startFullIndex, imd2.getRmd(2)._startFullIndex);
    ASSERT_EQ(rmd2._startRhs, imd2.getRmd(2)._startRhs);
    ASSERT_EQ(rmd2._offsetAfter, imd2.getRmd(2)._offsetAfter);
    ASSERT_EQ(rmd2._nofElements, imd2.getRmd(2)._nofElements);
    ASSERT_EQ(rmd2._nofBlocks, imd2.getRmd(2)._nofBlocks);
    ASSERT_EQ(rmd2._blocks.size(), imd2.getRmd(2)._blocks.size());
    ASSERT_EQ(rmd2._blocks[0]._firstLhs, imd2.getRmd(2)._blocks[0]._firstLhs);
    ASSERT_EQ(rmd2._blocks[0]._startOffset, imd2.getRmd(2)._blocks[0]._startOffset);
    ASSERT_EQ(rmd2._blocks[1]._firstLhs, imd2.getRmd(2)._blocks[1]._firstLhs);
    ASSERT_EQ(rmd2._blocks[1]._startOffset, imd2.getRmd(2)._blocks[1]._startOffset);
}
TEST(RelationMetaDataTest, getBlockStartAndNofBytesForLhsTest) {
    vector<BlockMetaData> bs;
    off_t afterFI =  6 * 2 * sizeof(Id);
    off_t afterLhs = afterFI + 4 * (sizeof(Id) + sizeof(off_t));
    off_t afterRhs = afterLhs + 6 * sizeof(Id);
    bs.push_back(BlockMetaData(10, afterFI));
    bs.push_back(BlockMetaData(16, afterFI + 2 * (sizeof(Id) + sizeof(off_t))));
    RelationMetaData rmd(1, 0, afterLhs, afterRhs, 6, 2, bs);

    auto rv = rmd.getBlockStartAndNofBytesForLhs(10);
    ASSERT_EQ(afterFI, rv.first);
    ASSERT_EQ(2 * (sizeof(Id) + sizeof(off_t)), rv.second);
    rv = rmd.getBlockStartAndNofBytesForLhs(15);
    ASSERT_EQ(afterFI, rv.first);
    ASSERT_EQ(2 * (sizeof(Id) + sizeof(off_t)), rv.second);
    rv = rmd.getBlockStartAndNofBytesForLhs(16);
    ASSERT_EQ(afterFI + 2 * (sizeof(Id) + sizeof(off_t)), rv.first);
    ASSERT_EQ(2 * (sizeof(Id) + sizeof(off_t)), rv.second);
    rv = rmd.getBlockStartAndNofBytesForLhs(17);
    ASSERT_EQ(afterFI + 2 * (sizeof(Id) + sizeof(off_t)), rv.first);
    ASSERT_EQ(2 * (sizeof(Id) + sizeof(off_t)), rv.second);
}