version 1.4.30b
[polyglot.git] / hash.c
diff --git a/hash.c b/hash.c
new file mode 100644 (file)
index 0000000..4baa0aa
--- /dev/null
+++ b/hash.c
@@ -0,0 +1,128 @@
+\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