Add forgotten files 1.4.70b
[polyglot.git] / hash.cpp
1 \r
2 // hash.cpp\r
3 \r
4 // includes\r
5 \r
6 #include "board.h"\r
7 #include "hash.h"\r
8 #include "piece.h"\r
9 #include "random.h"\r
10 #include "square.h"\r
11 #include "util.h"\r
12 \r
13 // variables\r
14 \r
15 static uint64 Castle64[16];\r
16 \r
17 // prototypes\r
18 \r
19 static uint64 hash_castle_key_debug (int flags);\r
20 \r
21 // functions\r
22 \r
23 // hash_init()\r
24 \r
25 void hash_init() {\r
26 \r
27    int i;\r
28 \r
29    for (i = 0; i < 16; i++) Castle64[i] = hash_castle_key_debug(i);\r
30 }\r
31 \r
32 // hash_key()\r
33 \r
34 uint64 hash_key(const board_t * board) {\r
35 \r
36    uint64 key;\r
37    int colour;\r
38    const uint8 * ptr;\r
39    int sq, piece;\r
40 \r
41    ASSERT(board_is_ok(board));\r
42 \r
43    // init\r
44 \r
45    key = 0;\r
46 \r
47    // pieces\r
48 \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
53       }\r
54    }\r
55 \r
56    // castle flags\r
57 \r
58    key ^= hash_castle_key(board_flags(board));\r
59 \r
60    // en-passant square\r
61 \r
62    sq = board->ep_square;\r
63    if (sq != SquareNone) key ^= hash_ep_key(sq);\r
64 \r
65    // turn\r
66 \r
67    key ^= hash_turn_key(board->turn);\r
68 \r
69    return key;\r
70 }\r
71 \r
72 // hash_piece_key()\r
73 \r
74 uint64 hash_piece_key(int piece, int square) {\r
75 \r
76    ASSERT(piece_is_ok(piece));\r
77    ASSERT(square_is_ok(square));\r
78 \r
79    return random_64(RandomPiece+piece_to_12(piece)*64+square_to_64(square));\r
80 }\r
81 \r
82 // hash_castle_key()\r
83 \r
84 uint64 hash_castle_key(int flags) {\r
85 \r
86    ASSERT((flags&~0xF)==0);\r
87 \r
88    return Castle64[flags];\r
89 }\r
90 \r
91 // hash_castle_key_debug()\r
92 \r
93 static uint64 hash_castle_key_debug(int flags) {\r
94 \r
95    uint64 key;\r
96    int i;\r
97 \r
98    ASSERT((flags&~0xF)==0);\r
99 \r
100    key = 0;\r
101 \r
102    for (i = 0; i < 4; i++) {\r
103       if ((flags & (1<<i)) != 0) key ^= random_64(RandomCastle+i);\r
104    }\r
105 \r
106    return key;\r
107 }\r
108 \r
109 // hash_ep_key()\r
110 \r
111 uint64 hash_ep_key(int square) {\r
112 \r
113    ASSERT(square_is_ok(square));\r
114 \r
115    return random_64(RandomEnPassant+square_file(square));\r
116 }\r
117 \r
118 // hash_turn_key()\r
119 \r
120 uint64 hash_turn_key(int colour) {\r
121 \r
122    ASSERT(colour_is_ok(colour));\r
123 \r
124    return (colour_is_white(colour)) ? random_64(RandomTurn) : 0;\r
125 }\r
126 \r
127 // end of hash.cpp\r
128 \r