Exemplo n.º 1
0
unsigned Hash::GetKey(
  const Header& header)
{
  // TRICK: 12 bits (4096) --> 132 combinations, 8 bits.
  int tFullTrick = header.GetTrickKey();
  int tRedTrick;
  if (trickKeyMap[tFullTrick] == 0)
    trickKeyMap[tFullTrick] = keyMapNo++;
  tRedTrick = trickKeyMap[tFullTrick]-1;
  assert(tFullTrick < SDS_HASH_LENTRICK);
  assert(tRedTrick < 250);

  // RANK: 12 bits ( 4096) --> 399 combinations,  9 bits.
  // RANK: 16 bits (65536) --> 593 combinations, 10 bits.
  int tFullRank = header.GetRankKey();
  int tRedRank;
  if (rankKeyMap[tFullRank] == 0)
    rankKeyMap[tFullRank] = rankMapNo++;
  tRedRank = rankKeyMap[tFullRank]-1;
  assert(tFullRank < SDS_HASH_LENRANK);
  assert(tRedRank < 1000);

  // CASE: ? bits --> 20 combinations, 5 bits.
  unsigned tFullCase = header.GetKeyNew();
  int tRedCase;
  if (caseKeyMap[tFullCase] == 0)
    caseKeyMap[tFullCase] = caseMapNo++;
  tRedCase = caseKeyMap[tFullCase]-1;
  assert(tFullCase < SDS_HASH_LENCASE);
  assert(tRedCase < 128);

  int tFullRankCase = (tRedRank << 7) | tRedCase;
  int tRedRankCase;
  if (rankCaseKeyMap[tFullRankCase] == 0)
    rankCaseKeyMap[tFullRankCase] = rankCaseMapNo++;
  tRedRankCase = rankCaseKeyMap[tFullRankCase]-1;
  assert(tFullRankCase < SDS_HASH_LENRANKCASE);
  assert(tRedRankCase < 4096);

  int key = (tRedRankCase << 8) | tRedTrick;
  assert(key < ML_MAXKEY);

  return key;
}