15 static uint64 Castle64[16];
\r
19 static uint64 hash_castle_key_debug (int flags);
\r
29 for (i = 0; i < 16; i++) Castle64[i] = hash_castle_key_debug(i);
\r
34 uint64 hash_key(const board_t * board) {
\r
41 ASSERT(board_is_ok(board));
\r
49 for (colour = 1; colour <= 2; colour++) { // HACK
\r
50 for (ptr = board->list[colour]; (sq=*ptr) != SquareNone; ptr++) {
\r
51 piece = board->square[sq];
\r
52 key ^= hash_piece_key(piece,sq);
\r
58 key ^= hash_castle_key(board_flags(board));
\r
60 // en-passant square
\r
62 sq = board->ep_square;
\r
63 if (sq != SquareNone) key ^= hash_ep_key(sq);
\r
67 key ^= hash_turn_key(board->turn);
\r
74 uint64 hash_piece_key(int piece, int square) {
\r
76 ASSERT(piece_is_ok(piece));
\r
77 ASSERT(square_is_ok(square));
\r
79 return random_64(RandomPiece+piece_to_12(piece)*64+square_to_64(square));
\r
82 // hash_castle_key()
\r
84 uint64 hash_castle_key(int flags) {
\r
86 ASSERT((flags&~0xF)==0);
\r
88 return Castle64[flags];
\r
91 // hash_castle_key_debug()
\r
93 static uint64 hash_castle_key_debug(int flags) {
\r
98 ASSERT((flags&~0xF)==0);
\r
102 for (i = 0; i < 4; i++) {
\r
103 if ((flags & (1<<i)) != 0) key ^= random_64(RandomCastle+i);
\r
111 uint64 hash_ep_key(int square) {
\r
113 ASSERT(square_is_ok(square));
\r
115 return random_64(RandomEnPassant+square_file(square));
\r
120 uint64 hash_turn_key(int colour) {
\r
122 ASSERT(colour_is_ok(colour));
\r
124 return (colour_is_white(colour)) ? random_64(RandomTurn) : 0;
\r