zoukankan      html  css  js  c++  java
  • hive中的subkeylist的结构详解。。

    在网上找了一圈。。也没有找到相关的资料。。一点都没有。。。  还有有大米公开的代码供参考。。。 赶紧把学习的成果记录下来。。

    CM_KEY_NODE 的结构:

     +0x014 SubKeyCounts      : [2] Uint4B                 //SubKeyCounts[0]子键的个数

     +0x01c SubKeyLists       : [2] Uint4B              //SubKeyLists[0]子键列表相差本BIN的偏移

    这里的subKeyList是一个偏移。。指向 CM_KEY_INDEX结构。。最复杂的也是这个结构。。

    他有好几种变形。。。

    可以是:

    lf 结构

        + lf

        +lh

    li 结构

    ri 结构

    可以根据 signature判断当前的index 属于那种结构。。对于每一种结构都有对应的 格式

    struct lf_key {

      short id;         /* 0x0000 Word ID: ASCII-"lf" = 0x666C or "lh" = 0x686c */
      short no_keys;    /* 0x0002 Word number of keys          */
                        /* 0x0004 ???? Hash-Records            */
     
     union {

        struct lf_hash {
          long ofs_nk;    /* 0x0000 D-Word Offset of corresponding "nk"-Record  */
          char name[4];   /* 0x0004 D-Word ASCII: the first 4 characters of the key-name,  */
        } hash[1];

          /* WinXP uses a more real hash instead (base 37 of uppercase name chars)  */
          /*   padded with 0's. Case sensitiv!                         */

        struct lh_hash {
          long ofs_nk;    /* 0x0000 D-Word Offset of corresponding "nk"-Record  */
          long hash;      /* 0x0004 D-Word ASCII: the first 4 characters of the key-name,  */
        } lh_hash[1];
      };

    };

    /* 3.x version of the above, contains only offset table, NOT
     * any start of names "hash". Thus needs 'nk' lookups for searches.
     */
    struct li_key {

      short id;         /* 0x0000 Word ID: ASCII-"li" = 0x696C */
      short no_keys;    /* 0x0002 Word number of keys          */
                        /* 0x0004 ???? Hash-Records            */
      struct li_hash {
        long ofs_nk;    /* 0x0000 D-Word Offset of corresponding "nk"-Record  */
      } hash[1];
    };


    /* This is a list of pointers to struct li_key, ie
     * an extention record if many li's.
     * This happens in NT4&5 when the lf hashlist grows larger
     * than about 400-500 entries/subkeys??, then the nk_key->ofs_lf points to this
     * instead of directly to an lf.
     * The sub-indices this points to seems to be li (yes!) in NT4 and 2k.
     * In XP and newer they point to lh which is more efficient.
     * Likely to happen in HKLM\Software\classes (file extention list) and
     * in SAM when many users.
     */
    struct ri_key {

      short id;         /* 0x0000 Word ID: ASCII-"ri" = 0x6972 */
      short no_lis;    /* 0x0002 Word number of pointers to li */
                        /* 0x0004 ???? Hash-Records            */
      struct ri_hash {
          long ofs_li;    /* 0x0000 D-Word Offset of corresponding "li"-Record  */
      } hash[1];
    };

    当subkey的数量大约500时。。是ri结构。。ri结构保存了li结构或lf结构的索引。。

    枚举一个Key的subKey的code:

    Code

    如果没有ri结构:找到subkey的 CM_Key_NODE结构的过程是这样的:

                                                      index.hash[i].ofs_nk

    1.subKeyList--------》index结构----------------------------》key_Node

    有ri结构:

                                                             rikey->hash[r].ofs_li                            index.hash[i].ofs_nk   

    subkeylist ----------------> ri_index--------------------------------->li/lf结构----------------------------------》 Key_node

    真日啊 。。。费劲。。


     

  • 相关阅读:
    Educational Codeforces Round 33 (Rated for Div. 2) B. Beautiful Divisors【进制思维/打表】
    Educational Codeforces Round 33 (Rated for Div. 2) A. Chess For Three【模拟/逻辑推理】
    java中的BigInteger
    动态规划-最长上升子序列(LIS模板)多解+变形
    Rain on your Parade---hdu2389(HK求最大匹配)
    Air Raid---hdu1151(最小路径覆盖)
    Swap---hdu2819(最大匹配)
    棋盘游戏---hdu1281(最大匹配)
    The Accomodation of Students---hdu2444(二分图,最大匹配)
    COURSES---poj1469 hdu1083(最大匹配)
  • 原文地址:https://www.cnblogs.com/herso/p/1517965.html
Copyright © 2011-2022 走看看