为每个国际象棋位置生成唯一的位置键

Generating unique position key for every chess position

我正在尝试创建一个国际象棋引擎。有人告诉我,我们可以通过散列单个棋子密钥来为任何国际象棋位置生成唯一密钥。就像特定方块上的特定棋子具有唯一的 64 位密钥。然后我们应该对位置中出现的每个棋子的棋子键进行异或。

忽略关于国际象棋位置的castling和en Passant方块信息,这是告诉我如何生成位置键(C语言)

typedef unsigned long long U64;
#define RAND_64 (   (U64) rand() + \
                    (U64) rand() << 15 + \
                    (U64) rand() << 31 + \
                    (U64) rand() << 45 \
                )

这是从上面声明的 RAND 64 生成片段密钥的方式...

int index, index2;
U64 pieceKeys[12][64]; // For 12 pieces on every possible square.

for(index = 0; index<12; index++) {
    for(index2 = 0; index2<64; index2++) { 
        pieceKeys[index][index2] = RAND_64;
    }
}

我的问题是,这里不可能为 2 个正方形上的 2 个棋子生成相同的棋子密钥。如果发生这种情况,那么当我们通过对片段键进行异或运算来创建位置键时就会出现歧义。

我说的对吗?如果是这样,我该如何解决这个潜在问题?

只有6种不同类型的棋子,然后是黑色和白色。黑色或白色使用 1 位,棋子类型使用 3 位,平方数使用 7 位,例如:

// square numbes are 0x0000 thru 0x007F
#define BLACK 0x0080
#define WHITE 0x0000

#define KING   0x0100
#define QUEEN  0x0200
#define ROOK   0x0400
#define BISHOP 0x0800
#define KNIGHT 0x1000
#define PAWN   0x2000

#define PIECE_MASK    0x3F00
#define SQUARE_MASK   0x007F

并使用位掩码来确定它们:

int color= board[x][y] & BLACK; // non zero if black; zero if white
int is_king= board[x][y] & KING;
int squarenum= board[x][y] & SQUARE_MASK;

int piece= board[x][y] & PIECE_MASK;
switch (piece>>8) {
    case 1: //King
    case 2: //Queen
    case 4: //Rook
    case 8: //Bishop
    case 16://Knight
    case 32://Pawn
}