X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=hash.c;fp=hash.c;h=4baa0aac68e6a150bcc81c82510e936f93ae455a;hb=e15efca6667b2673b4c1a5879a6917eab6800e58;hp=0000000000000000000000000000000000000000;hpb=0d182b4efac85dce968068bfe4509e52e9a30051;p=polyglot.git diff --git a/hash.c b/hash.c new file mode 100644 index 0000000..4baa0aa --- /dev/null +++ b/hash.c @@ -0,0 +1,128 @@ + +// hash.c + +// includes + +#include "board.h" +#include "hash.h" +#include "piece.h" +#include "random.h" +#include "square.h" +#include "util.h" + +// variables + +static uint64 Castle64[16]; + +// prototypes + +static uint64 hash_castle_key_debug (int flags); + +// functions + +// hash_init() + +void hash_init() { + + int i; + + for (i = 0; i < 16; i++) Castle64[i] = hash_castle_key_debug(i); +} + +// hash_key() + +uint64 hash_key(const board_t * board) { + + uint64 key; + int colour; + const uint8 * ptr; + int sq, piece; + + ASSERT(board_is_ok(board)); + + // init + + key = 0; + + // pieces + + for (colour = 1; colour <= 2; colour++) { // HACK + for (ptr = board->list[colour]; (sq=*ptr) != SquareNone; ptr++) { + piece = board->square[sq]; + key ^= hash_piece_key(piece,sq); + } + } + + // castle flags + + key ^= hash_castle_key(board_flags(board)); + + // en-passant square + + sq = board->ep_square; + if (sq != SquareNone) key ^= hash_ep_key(sq); + + // turn + + key ^= hash_turn_key(board->turn); + + return key; +} + +// hash_piece_key() + +uint64 hash_piece_key(int piece, int square) { + + ASSERT(piece_is_ok(piece)); + ASSERT(square_is_ok(square)); + + return random_64(RandomPiece+piece_to_12(piece)*64+square_to_64(square)); +} + +// hash_castle_key() + +uint64 hash_castle_key(int flags) { + + ASSERT((flags&~0xF)==0); + + return Castle64[flags]; +} + +// hash_castle_key_debug() + +static uint64 hash_castle_key_debug(int flags) { + + uint64 key; + int i; + + ASSERT((flags&~0xF)==0); + + key = 0; + + for (i = 0; i < 4; i++) { + if ((flags & (1<