Cassandra hashes partition keys (Murmur3) to a 64-bit token, placed on a ring. Each node owns ranges of tokens. With virtual nodes (vnodes), each node owns many small ranges — more even distribution.
Adding a new node: it claims new vnodes; only those ranges stream from neighbors. No global rebalance.