from functools import reduce


def constant_time_compare(x, y):
    """
    Compares two byte strings in a way such that execution time is constant
    regardless of how much alike the input values are, provided that they
    are of the same length.

    Comparisons between user input and secret data such as calculated
    HMAC values needs to be executed in constant time to avoid leaking
    information to the caller via the timing side channel.

    Params:
        x: the first byte string to compare
        y: the second byte string to compare
    Return: True if x and y are equal, else False
    """
    if len(x) != len(y):
        return False
    n = reduce(lambda a, b: a | b, (ord(x) ^ ord(y) for x, y in zip(x, y)))
    return n == 0