U64 hash_key(const board_t *board) { ASSERT(board != nullptr); // init U64 key = 0; // pieces for (S8 colour = 0; colour < ColourNb; ++colour) { for (auto sq = board->piece[colour].begin(); sq != board->piece[colour].end(); ++sq) { const S32 piece = board->square[*sq]; key ^= hash_piece_key(piece, *sq); } for (auto sq = board->pawn[colour].begin(); sq != board->pawn[colour].end(); ++sq) { const S32 piece = board->square[*sq]; key ^= hash_piece_key(piece, *sq); } } // castle flags key ^= hash_castle_key(board->flags); // en-passant square const S32 sq = board->ep_square; if (sq != SquareNone) key ^= hash_ep_key(sq); // turn key ^= hash_turn_key(board->turn); return key; }
uint64 hash_key(const board_t * board) { uint64 key; int colour; const sq_t * ptr; int sq, piece; ASSERT(board!=NULL); // init key = 0; // pieces for (colour = 0; colour < ColourNb; colour++) { for (ptr = &board->piece[colour][0]; (sq=*ptr) != SquareNone; ptr++) { piece = board->square[sq]; key ^= hash_piece_key(piece,sq); } for (ptr = &board->pawn[colour][0]; (sq=*ptr) != SquareNone; ptr++) { piece = board->square[sq]; key ^= hash_piece_key(piece,sq); } } // castle flags key ^= hash_castle_key(board->flags); // en-passant square sq = board->ep_square; if (sq != SquareNone) key ^= hash_ep_key(sq); // turn key ^= hash_turn_key(board->turn); return key; }