--- /dev/null
+\r
+// hash.c\r
+\r
+// includes\r
+\r
+#include "board.h"\r
+#include "hash.h"\r
+#include "piece.h"\r
+#include "random.h"\r
+#include "square.h"\r
+#include "util.h"\r
+\r
+// variables\r
+\r
+static uint64 Castle64[16];\r
+\r
+// prototypes\r
+\r
+static uint64 hash_castle_key_debug (int flags);\r
+\r
+// functions\r
+\r
+// hash_init()\r
+\r
+void hash_init() {\r
+\r
+ int i;\r
+\r
+ for (i = 0; i < 16; i++) Castle64[i] = hash_castle_key_debug(i);\r
+}\r
+\r
+// hash_key()\r
+\r
+uint64 hash_key(const board_t * board) {\r
+\r
+ uint64 key;\r
+ int colour;\r
+ const uint8 * ptr;\r
+ int sq, piece;\r
+\r
+ ASSERT(board_is_ok(board));\r
+\r
+ // init\r
+\r
+ key = 0;\r
+\r
+ // pieces\r
+\r
+ for (colour = 1; colour <= 2; colour++) { // HACK\r
+ for (ptr = board->list[colour]; (sq=*ptr) != SquareNone; ptr++) {\r
+ piece = board->square[sq];\r
+ key ^= hash_piece_key(piece,sq);\r
+ }\r
+ }\r
+\r
+ // castle flags\r
+\r
+ key ^= hash_castle_key(board_flags(board));\r
+\r
+ // en-passant square\r
+\r
+ sq = board->ep_square;\r
+ if (sq != SquareNone) key ^= hash_ep_key(sq);\r
+\r
+ // turn\r
+\r
+ key ^= hash_turn_key(board->turn);\r
+\r
+ return key;\r
+}\r
+\r
+// hash_piece_key()\r
+\r
+uint64 hash_piece_key(int piece, int square) {\r
+\r
+ ASSERT(piece_is_ok(piece));\r
+ ASSERT(square_is_ok(square));\r
+\r
+ return random_64(RandomPiece+piece_to_12(piece)*64+square_to_64(square));\r
+}\r
+\r
+// hash_castle_key()\r
+\r
+uint64 hash_castle_key(int flags) {\r
+\r
+ ASSERT((flags&~0xF)==0);\r
+\r
+ return Castle64[flags];\r
+}\r
+\r
+// hash_castle_key_debug()\r
+\r
+static uint64 hash_castle_key_debug(int flags) {\r
+\r
+ uint64 key;\r
+ int i;\r
+\r
+ ASSERT((flags&~0xF)==0);\r
+\r
+ key = 0;\r
+\r
+ for (i = 0; i < 4; i++) {\r
+ if ((flags & (1<<i)) != 0) key ^= random_64(RandomCastle+i);\r
+ }\r
+\r
+ return key;\r
+}\r
+\r
+// hash_ep_key()\r
+\r
+uint64 hash_ep_key(int square) {\r
+\r
+ ASSERT(square_is_ok(square));\r
+\r
+ return random_64(RandomEnPassant+square_file(square));\r
+}\r
+\r
+// hash_turn_key()\r
+\r
+uint64 hash_turn_key(int colour) {\r
+\r
+ ASSERT(colour_is_ok(colour));\r
+\r
+ return (colour_is_white(colour)) ? random_64(RandomTurn) : 0;\r
+}\r
+\r
+// end of hash.cpp\r
+\r