Fact-checked by Grok 2 weeks ago

Zobrist hashing

Zobrist hashing is a technique for generating hash keys to represent board positions in computer programs that play abstract strategy games such as chess and Go, enabling efficient storage and retrieval in transposition tables to avoid redundant computations during game tree searches. Invented by Albert Lindsey Zobrist in 1970 as part of his work on and game playing, it was first described in a outlining a general method for hash coding applicable to board games like checkers, chess, and Go. The core mechanism of Zobrist hashing involves precomputing a table of pseudorandom 64-bit integers, with one value assigned to each possible piece type on each board square (for chess, 12 piece types × 64 squares = 768 values), plus additional values for game states like castling rights, en passant targets, and whose turn it is. To compute the hash for a given position, the relevant random values are combined using the bitwise XOR operation, resulting in a compact, unique (though not collision-free) identifier that distributes evenly across the 64-bit space. Updating the hash during a move is incremental and efficient: XOR out the values for the old position (e.g., removing or moving a piece) and XOR in the new ones, allowing real-time computation without recalculating the entire board. This approach revolutionized game-playing AI by facilitating transposition tables, where previously evaluated positions can be quickly looked up to prune search trees, significantly speeding up algorithms like with alpha-beta pruning. Despite inevitable collisions due to the birthday paradox—estimated at around 4 billion positions for 64-bit keys before a 50% collision probability—the method's speed, low space overhead, and platform portability (via reproducible pseudorandom number generators) make it the standard in chess engines and similar applications. Zobrist's innovation has endured, with later studies confirming its near-optimal properties for incremental hashing in sequential data structures like game boards.

Overview

Definition and Purpose

Zobrist hashing is a hashing method employed in computer implementations of board games, where precomputed random 64-bit integers are assigned to each possible combination of game piece and board position, and the hash value for a given position is obtained by performing the bitwise XOR operation on the integers corresponding to the pieces present on the board. This approach generates a compact, nearly unique numerical identifier for complex game states, facilitating efficient storage and retrieval in memory-constrained environments typical of game-playing algorithms. The primary purpose of Zobrist hashing is to enable fast identification of board positions within transposition tables, which are used in search algorithms to store previously evaluated states and their associated values, thereby avoiding redundant computations and accelerating the search process. By providing a quick way to map positions to table entries, it significantly reduces the time required for or alpha-beta in two-player games like chess, where evaluating all possible moves from scratch would be computationally prohibitive. Zobrist hashing represents the first known instance of tabulation hashing, a broader class of constructions that rely on table lookups combined with simple operations like XOR to achieve universality and low collision probabilities. In practical applications, it also plays a crucial role in detecting position repetitions that lead to draws, such as the rule in chess—where the same position occurs three times with the same player to move—or superko rules in Go, which prevent cycles by disallowing positions identical to any earlier one in the game history.

History

Zobrist hashing was invented by Albert L. Zobrist, an American computer scientist, during his doctoral research at the University of Wisconsin-Madison. As part of his work on and game playing, Zobrist developed the method to efficiently represent board positions in abstract games like chess and Go, addressing the challenges of limited computational resources in early systems. The technique was first formally documented in Zobrist's titled A New Hashing Method with Application for Game Playing, published in April 1970 as Technical Report #88 by the Department of Computer Sciences at the University of Wisconsin-Madison. In this seminal work, Zobrist described the hashing approach as a general solution for storing and retrieving states, emphasizing its suitability for incremental updates and low collision rates in transposition tables. The report highlighted applications to board games such as , chess, and Go, demonstrating its versatility beyond a single domain. Zobrist initially applied the hashing method in collaborative efforts on early chess programs, notably the USC Chess Program developed with Frederic R. Carlson at the University of Southern California in the early 1970s. This program, which participated in North American Computer Chess Championships in 1972, incorporated Zobrist's technique to manage position evaluations efficiently, marking one of the first practical implementations in competitive chess AI. The approach also featured in Zobrist and Carlson's 1973 publication on an advice-taking chess computer, where it supported selective search enhancements. From its origins in manual coding on limited hardware, Zobrist hashing evolved rapidly within the computer game programming community during the and . Early adopters praised its simplicity for software implementation without specialized hardware, leading to its integration into numerous chess engines as a core component for tables and identification. By the late , it had become a foundational tool in for board games, influencing programs like CHESS 4.5 and subsequent developments that prioritized efficient state representation.

Fundamentals

Hash Table Initialization

The Zobrist hash table is initialized by generating a collection of random 64-bit integers, each uniquely assigned to a potential element of the game state, such as a specific on a specific board . In the context of chess, the table accommodates 12 distinct piece types—, , , , , and for each of the two colors—combined with the squares of the board, producing 768 random values; an additional value accounts for whose turn it is to move. For a full chess , further values are included for rights (typically 4 keys, one for each possible castling option) and targets (typically 8 keys, one for each file), bringing the total to approximately 781 entries. This setup ensures that every conceivable configuration contributes a distinct pseudorandom key to the hashing process. The table is commonly implemented as a multi-dimensional , for example, Zobrist[piece][square], where the piece index represents both the type and color (e.g., 0-5 for white pieces, 6-11 for black), and the square index ranges from 0 to 63 corresponding to the board's to h8 positions. Additional arrays or indices handle and . Initialization occurs once at the program's startup: a (PRNG) is seeded with a fixed value to produce reproducible results across different runs, and the array is populated sequentially with the generated 64-bit integers. This one-time computation is efficient and maintains hash consistency without requiring regeneration during gameplay. To achieve effective hashing properties, the PRNG must produce high-quality random numbers with minimal correlations, ideally using a generator that approximates a universal hash family and minimizes systematic collisions. Poorly chosen or low-entropy random values can lead to detectable patterns, degrading the hash's uniformity; thus, implementations often employ robust algorithms.

Calculation of the Hash Value

The calculation of the Zobrist hash value for a given board position involves iterating over the board and accumulating a bitwise XOR of random values from the preinitialized table, corresponding to each occupied square and its piece type, as well as relevant game state features like turn, castling rights, and en passant targets. This process begins with an initial hash value of zero. For each square on the board that contains a piece, the hash is updated by XORing it with the table entry Zobrist[piece_type][square_index], where piece_type identifies the specific piece (e.g., white pawn, black king) and square_index denotes the position on the board. The hash is further XORed with dedicated random values for the current turn (e.g., Zobrist[turn_black] if black to move), applicable castling rights (one or more of four keys if available), and en passant target (the key for the relevant file if applicable). This computation can be expressed formally as: h = \bigoplus_{i=1}^{n} Z[p_i][s_i] \oplus Z \oplus \bigoplus_{c \in C} Z \oplus Z where h is the resulting , the \oplus denotes bitwise XOR, n is the number of on the board, p_i is the type of the i-th , s_i is the square of that piece, t indicates the turn, C is the set of available rights (0 to 4 keys), e is the en passant file key (or 0 if none), and Z is the precomputed of random 64-bit integers. The following pseudocode illustrates the step-by-step process for an board like chess, assuming a table Zobrist with dimensions for 12 piece types (6 per color) and 64 squares, plus extras for turn, , and :
function calculate_zobrist_hash(board, turn, castling, en_passant):
    hash_value = 0
    for row in 0 to 7:
        for col in 0 to 7:
            square = row * 8 + col
            if board[row][col] != empty:
                piece_type = get_piece_type(board[row][col])
                hash_value ^= Zobrist[piece_type][square]
    # XOR for turn
    if turn == black:
        hash_value ^= Zobrist[turn_black]
    # XOR for castling rights
    if castling & white_kingside:
        hash_value ^= Zobrist[castling_white_kingside]
    if castling & white_queenside:
        hash_value ^= Zobrist[castling_white_queenside]
    if castling & black_kingside:
        hash_value ^= Zobrist[castling_black_kingside]
    if castling & black_queenside:
        hash_value ^= Zobrist[castling_black_queenside]
    # XOR for en passant
    if en_passant != none:
        file = get_file(en_passant)
        hash_value ^= Zobrist[en_passant_keys][file]
    return hash_value
This algorithm scans the entire board once, performing a constant-time XOR operation per occupied square and state feature, resulting in O(board_size) for the initial . The use of XOR as the combining operation is central to the method's efficiency and properties. XOR is invertible, meaning applying the same operation twice to the same value returns the original (i.e., a \oplus b \oplus b = a), which facilitates incremental updates without full recomputation—though the focus here is on initial calculation. Furthermore, the Zobrist construction using independent random values and XOR forms a strongly family, ensuring that for any two distinct positions, the probability of collision is at most 1/2^{64} under uniform random table entries, providing near-uniform distribution over the 64-bit output space. The final result is a 64-bit integer that serves as a compact, ideally for the board position, enabling fast lookups in transposition tables for game tree search algorithms. While collisions are theoretically possible due to the (with 2^{64} possible hashes but vastly more positions in complex games), the universal hashing properties minimize their practical occurrence.

Implementation

Updating the Hash Value

Zobrist hashing enables efficient incremental updates to the whenever the board changes, such as when a piece is moved, allowing the hash to be modified in constant O(1) per operation rather than recomputing it from scratch. This property stems from the use of XOR operations, which are their own inverses, meaning applying the same XOR twice returns the original . For a standard non-capturing move of a piece from square A to square B, the update formula is: \text{hash}_{\text{new}} = \text{hash}_{\text{old}} \oplus \text{Zobrist[piece][A]} \oplus \text{Zobrist[piece][B]} where \oplus denotes the bitwise XOR operation. This removes the piece's contribution from A and adds it to B. In the case of a capture, an additional XOR is performed to remove the captured piece from square B: \text{hash}_{\text{new}} = \text{hash}_{\text{old}} \oplus \text{Zobrist[moving\_piece][A]} \oplus \text{Zobrist[moving\_piece][B]} \oplus \text{Zobrist[captured\_piece][B]} These updates ensure the hash reflects the exact new position with minimal computation. In addition to move-specific updates, the hash must account for changes to game state flags. Any previous target square, if present, must be cleared by XORing its corresponding key, and a new en passant target key is XORed only if the move creates one (typically a two-square pawn advance). Similarly, castling rights are toggled by XORing the relevant keys if the move revokes them, such as when the king or a moves from its original square, regardless of whether the move is castling itself. Special moves require predefined adjustments to account for multiple changes or additional state. For , the update XORs the moving pieces (king and rook) from their original squares and to their new squares, and also toggles the relevant castling rights keys to reflect the loss of those permissions. En passant captures involve XORing the pawn's move as usual, plus removing the captured pawn from its behind-square via an additional XOR, and clearing the target square key. Pawn promotions XOR out the pawn from its original square and XOR in the promoted piece on the destination square, handling the piece type change directly. Each of these operations remains O(1), as the number of XORs is bounded by a small constant (typically 2–5 per move). The following pseudocode illustrates a basic update routine for a move, assuming access to move details like from/to squares, piece types, flags for special cases, current en passant target, and affected castling rights:
function update_hash(current_hash, move, current_en_passant, affected_castling):
    hash = current_hash
    
    // Clear previous en passant if any
    if current_en_passant != none:
        hash ^= en_passant_keys[current_en_passant]
    
    // Remove moving piece from origin
    hash ^= zobrist_keys[side][moving_piece][from_square]
    
    // Place moving piece on destination
    hash ^= zobrist_keys[side][moving_piece][to_square]
    
    // Handle capture if present
    if move.is_capture:
        hash ^= zobrist_keys[opponent_side][captured_piece][to_square]
    
    // Special cases
    if move.is_castling:
        // Update rook (example for kingside white)
        if side == white:
            rook_from = h1
            rook_to = f1
        else:
            rook_from = h8
            rook_to = f8
        hash ^= zobrist_keys[side][rook][rook_from]
        hash ^= zobrist_keys[side][rook][rook_to]
    
    if move.is_en_passant:
        // Remove captured pawn (behind to_square, direction based on side)
        if side == white:
            captured_sq = to_square - 8
        else:
            captured_sq = to_square + 8
        hash ^= zobrist_keys[opponent_side][pawn][captured_sq]
    
    if move.is_promotion:
        // Remove the pawn placement on destination
        hash ^= zobrist_keys[side][pawn][to_square]
        // Add promoted piece
        hash ^= zobrist_keys[side][promoted_piece][to_square]
    
    // Update castling rights if affected (e.g., king/rook moved or captured)
    for right in affected_castling:
        hash ^= castling_keys[right]
    
    // Set new en passant target if created
    if move.creates_en_passant:
        new_target = // calculate target square (e.g., passed square)
        hash ^= en_passant_keys[new_target]
    
    // Toggle side to move
    hash ^= side_to_move_key
    
    return hash
This routine can be inverted for undoing moves by applying the same XORs in reverse, supporting efficient unmaking in search algorithms. In game tree traversal, such as alpha-beta search, these incremental updates facilitate maintaining a history of hash values along the search path, enabling quick detection of position repetitions (e.g., for claims) by checking if the current hash matches previous ones in the stack— a critical optimization for avoiding cycles and reducing search space.

Collision Handling

In Zobrist hashing, collisions occur when two distinct board positions produce the same hash value, a consequence of mapping an exponentially large state space to a fixed-size output, typically bits, resulting in a collision probability of approximately $2^{-[64](/page/64)} for any specific pair of positions under random assumptions. This risk follows from the , with practical collision likelihood increasing via the birthday paradox: for a transposition table of size n, the expected number of collisions is roughly n^2 / 2^{65}, remaining negligible until n approaches $2^{32} entries. In transposition tables, the serves as the for storing search results such as evaluations, best moves, or cutoffs, enabling rapid reuse during or alpha-beta searches. Upon a table probe, a matching retrieves the entry, but undetected collisions may lead to incorrect data application; common resolution involves storing additional metadata like search depth alongside the hash, overwriting entries only if the new position's depth exceeds the stored one to prioritize more reliable deeper searches. Alternative schemes include aging mechanisms or flags to evict older entries, minimizing error propagation without full position verification, which is computationally prohibitive. To further mitigate collisions, practitioners employ multiple independent Zobrist hashes—such as double or triple keys—each computed separately and used in tandem for table indexing or verification, effectively squaring or cubing the effective bit length and reducing pairwise collision odds to $2^{-128} or lower. Longer hash lengths, like 128-bit implementations, directly expand the output space, while rare verification by recomputing the full position from the board state can confirm matches at the cost of added overhead. Zobrist hashing's efficacy stems from its status as a 3-wise independent family, ensuring that any three distinct positions hash to uniformly random and independent values with probability 1, providing stronger collision resistance than mere pairwise independence for applications like cuckoo or chained hashing in transposition tables.

Applications

In Board Games

Zobrist hashing plays a pivotal role in computer implementations of combinatorial board games, where it enables efficient representation and comparison of game states to support search algorithms and rule enforcement. In chess, the technique was originally developed to address the challenges of evaluating vast position spaces in programs like and chess, allowing for rapid indexing without full board . By generating a compact key for each position, it facilitates key operations in search, marking a foundational advancement in game-playing since its introduction in 1970. In chess engines, Zobrist hashing is essential for detecting , a rule that declares a when the same position occurs three times during a game. This is achieved by maintaining a history of hash keys for prior positions and checking for matches, which avoids exhaustive board comparisons and conserves computational resources. It also populates transposition tables, which store partial search results to accelerate by reusing evaluations from equivalent positions encountered via different move orders. Modern engines like rely on 64-bit Zobrist keys for these tables, balancing collision resistance with update speed to enhance performance in deep searches. This integration has been standard in tournament-level chess programs since the , significantly boosting their ability to compete at high levels by reducing redundant computations. For Go, Zobrist hashing supports the superko rule, which prohibits repeating a previous board position to prevent infinite cycles, by providing a fast method to track and verify historical states across a game's potentially enormous state space. In (MCTS) algorithms, prevalent in strong Go programs, it identifies duplicate positions in the search tree, enabling transposition tables to prune redundant simulations and improve efficiency without storing full boards. This application extends the method's utility to Go's 19x19 board, where position uniqueness is critical for rule compliance and scalable exploration. Adaptations of Zobrist hashing extend to other board games like , where it was first applied to hash 8x8 positions with fewer piece types for transposition and repetition checks, and , which requires expanded key tables to accommodate 9x9 boards, 13 piece varieties per player, and hand-held reserves. For variable board sizes, such as rectangular up to 30 intersections, the hashing scheme scales by generating random keys proportional to the board dimensions and state features, maintaining low collision rates in transposition tables while supporting reductions. These modifications preserve the core incremental update mechanism, allowing efficient handling of diverse game complexities.

In Other Fields

Zobrist hashing has found applications in computational materials science, particularly in kinetic Monte Carlo (kMC) simulations for modeling atomic configurations and phase transformations in alloys. In these simulations, the method generates unique keys for lattice-based atomic arrangements, enabling efficient storage and retrieval of precomputed energies and transition rates to avoid redundant calculations during diffusional processes. For instance, in simulations of Fe-1at.%Cu alloys, Zobrist hashing facilitated state-history recall, achieving speedups of up to a factor of 6.3 at 773 K (where 85.1% of states were revisited) and over 100 at 373 K (with 99.9% revisits). More recent implementations in atomistic-object kMC for irradiation damage in tungsten employ 128-bit Zobrist keys to index off-lattice atomic configurations within a fine mesh, supporting large databases of up to 30,000 objects and reducing computational overhead through pensionable state replacement strategies. In and , Zobrist hashing supports state representation and caching in environments beyond traditional board games, such as systems. It enables compact hashing of game states for transposition tables in (MCTS) integrated with , allowing incremental updates via XOR operations on pseudorandom values assigned to state features like pieces and positions. This approach, as implemented in frameworks like Ludii, reduces search redundancy in multi-agent or complex puzzle domains by storing hash-based evaluations, thereby accelerating training and inference in agents. Additionally, in for , Zobrist hashing performs state aggregation by mapping variable-value pairs to indices (e.g., with 10^6 entries), grouping similar configurations to manage large state spaces in multi-objective tasks. In 2025, Zobrist hashing was applied in using , where it enables caching of evaluated expressions to avoid duplicates, achieving up to 34% speedups on real-world problems without affecting solution quality. The technique generalizes to any finite discrete state space, providing efficient indexing for search algorithms in combinatorial problems like puzzle solving. For example, in solvers for the puzzle, Zobrist hashing computes low-collision keys for board within pattern databases, storing distances to guide informed searches while selecting lower-cost values in rare collision cases to ensure admissibility. This adaptability extends its utility to sampling in probabilistic models, where post-2010 advancements it for caching states in optimization and simulation workflows, addressing scalability in high-dimensional discrete spaces.

Advantages and Limitations

Advantages

Zobrist hashing enables high-speed computation and updates of hash values through simple bitwise XOR operations, achieving constant for both generating and modifying hashes in dynamic environments. This efficiency stems from the method's reliance on precomputed random keys and incremental updates, where only the affected components are XORed in or out, avoiding full recomputation. Such properties make it particularly suitable for applications like game engines, where rapid position evaluation is critical during search algorithms. The technique offers low memory overhead by representing complex states, such as board positions, with a single fixed-size key—typically 64 or 128 bits—rather than storing the entire state data, which could require significantly more space (e.g., hundreds of bits for a full representation). This compact storage facilitates efficient transposition tables and caches, enabling scalability in memory-constrained systems without compromising the ability to distinguish most unique states. Zobrist hashing exhibits strong universality properties, providing a low probability of collisions due to the near-uniform distribution achieved by XORing independent random keys, approximating a collision rate of about 2^{-64} for 64-bit keys under the birthday paradox. This reduces the need for frequent position verification in practice, enhancing reliability in high-volume state explorations. Its simplicity, involving only array lookups and XOR operations, ensures easy implementation and portability across programming languages and platforms, with proven effectiveness in handling vast state spaces, as demonstrated in applications like computer Go where the position space exceeds 10^{170}.

Limitations and Considerations

Despite its efficiency, Zobrist hashing is prone to collisions, where distinct states map to the same value, potentially leading to incorrect lookups or overwrites in transposition tables. According to the birthday paradox applied to functions, in a 64-bit space, the probability of at least one collision approaches 50% after inserting approximately $2^{32} (about 4.3 billion) random keys into a table. This theoretical underscores the need for supplementary measures, such as employing multiple functions or position verification, particularly in domains requiring high reliability. The quality of randomness in generating the Zobrist keys critically influences hash uniformity and collision rates; inadequate pseudorandom number generators (PRNGs) may produce correlated values, exacerbating clustering and deviations from ideal distribution. To mitigate this, implementations should utilize robust PRNGs, such as , which provide high-quality, uncorrelated outputs suitable for cryptographic and hashing applications. PRNGs are often insufficient due to their limited period or predictability, prompting many systems to adopt custom generators for superior performance. Scalability poses challenges for Zobrist hashing in domains with enormous state spaces exceeding $2^{64} possibilities, as the fixed hash size limits unique representations without collisions. In such cases, extending to 128-bit or larger keys is necessary, but this increases memory demands for the key table—scaling linearly with the hash width—potentially straining resources in memory-constrained environments. For instance, chess applications typically suffice with 64 bits given the game's $10^{43} to $10^{47} positions, but broader adaptations require careful selection to balance and storage. Modern implementations address traditional limitations by integrating Zobrist variants with architectures, such as Abstract Zobrist Hashing for GPU-accelerated searches in puzzle-solving, which reduces communication overhead while preserving low collision rates. These enhancements enable handling larger-scale problems without proportional increases in computation time, though they demand optimized data distribution to leverage hardware effectively.

References

  1. [1]
    Zobrist Hashing - Chessprogramming wiki
    Zobrist Hashing, a technique to transform a board position of arbitrary size into a number of a set length, with an equal distribution over all possible ...
  2. [2]
  3. [3]
  4. [4]
    [PDF] A New Hashing Method with Application for Game Playing
    A NEW HASHING METHOD WITH APPLICATION. FOR GAME PLAYING by. Albert L. Zobrist. Technical Report #88. April 1970. Page 2. ABSTRACT. A general method of hash ...
  5. [5]
    Minimax Algorithm in Game Theory | Set 5 (Zobrist Hashing)
    Apr 26, 2023 · Zobrist Hashing is a hashing function that is widely used in 2 player board games. It is the most common hashing function used in transposition table.
  6. [6]
    Fast recall of state-history in kinetic Monte Carlo simulations utilizing ...
    Aug 5, 2025 · PDF | We present a novel application of the Zobrist hashing method, known in the computer chess literature, to simulation of diffusional phase..Missing: original | Show results with:original<|separator|>
  7. [7]
    The USC chess program | Proceedings of the ACM annual conference
    Zobrist, Albert L. A Hashing Method with Applications for Game Playing, Tech. Rep. 88, Computer Sciences Department, University of Wisconsin, Madison ...
  8. [8]
    AN ADVICE-TAKING CHESS COMPUTER on JSTOR
    Albert L. Zobrist, Frederic R. Carlson Jr., AN ADVICE-TAKING CHESS COMPUTER, Scientific American, Vol. 228, No. 6 (June 1973), pp. 92-105.
  9. [9]
    None
    ### Summary of Zobrist Hashing Advantages, Benefits, Efficiency, Speed, Memory Usage, and Properties in the Context of Duplicate Detection and General Use
  10. [10]
    [PDF] Fast and Powerful Hashing using Tabulation - arXiv
    Jan 3, 2017 · Simple tabulation hashing dates back to Zobrist [1970]. ... A new hashing method with application for game playing. Technical Report 88, Com-.<|control11|><|separator|>
  11. [11]
    [PDF] SOLVING GO FOR RECTANGULAR BOARDS - Maastricht University
    The transposition table implemented in MIGOS II uses Zobrist hashing (Zobrist, 1970) to identify board situa- tions. Problems may occur when two distinctly ...
  12. [12]
    [PDF] On Transposition Tables for Single-Agent Search and Planning
    The most common collision resolution policy keeps the value associated with the deeper search (which has a larger subtree size, and presumably saves more work).
  13. [13]
    Albert Zobrist - Chessprogramming wiki
    Technical Report #85, pdf; Albert Zobrist (1970). A New Hashing Method with Application for Game Playing. Technical Report #88, Computer Science Department ...
  14. [14]
  15. [15]
    [PDF] Monte Carlo Tree Search in Go - Department of Computing Science
    Zobrist hashing [74]: the Zobrist hash is a fast and fair method for mapping from Go boards to integers. It is used for storing positions in transposition ...
  16. [16]
  17. [17]
  18. [18]
    [PDF] Master Thesis Combining Deep Reinforcement Learning and Monte ...
    Feb 27, 2023 · Zobrist hashing. Instead of saving the entire board, Ludii [9, 42], the general game system used, uses Zobrist hashing [64] to create a hash ...
  19. [19]
  20. [20]
    [PDF] A Pattern Database Approach for Solving the TopSpin Puzzle Problem
    In this thesis, we present a domain spe- cific solver for the TopSpin Puzzle problem. This solver is based on the above-mentioned pattern database approach. We ...
  21. [21]
  22. [22]
    Hashtable collisions and the "birthday paradox" - UCSD CSE
    Hashtable collisions and the "birthday paradox". Suppose there are 365 slots in the hash table: M=365; What is the probability that there will be a collision ...
  23. [23]
    [PDF] arXiv:1708.05296v1 [cs.AI] 16 Aug 2017
    Aug 16, 2017 · Abstract Zobrist hashing (AZH) is a hybrid hashing strategy which augments the Zobrist hashing framework with the idea of projection from ...
  24. [24]