def setting_address(key):
        """Computes the radix address for the given setting key.

        Keys are broken into four parts, based on the dots in the string. For
        example, the key `a.b.c` address is computed based on `a`, `b`, `c` and
        the empty string. A longer key, for example `a.b.c.d.e`, is still
        broken into four parts, but the remaining pieces are in the last part:
        `a`, `b`, `c` and `d.e`.

        Each of these peices has a short hash computed (the first 16 characters
        of its SHA256 hash in hex), and is joined into a single address, with
        the config namespace (`000000`) added at the beginning.

        Args:
            key (str): the setting key
        Returns:
            str: the computed address
        """
        # split the key into 4 parts, maximum
        key_parts = key.split('.', maxsplit=_MAX_KEY_PARTS - 1)
        # compute the short hash of each part
        addr_parts = [_short_hash(x.encode()) for x in key_parts]
        # pad the parts with the empty hash, if needed
        addr_parts.extend([_EMPTY_PART] * (_MAX_KEY_PARTS - len(addr_parts)))

        return CONFIG_STATE_NAMESPACE + ''.join(addr_parts)
Computes the radix address for the given setting key.

        Keys are broken into four parts, based on the dots in the string. For
        example, the key `a.b.c` address is computed based on `a`, `b`, `c` and
        the empty string. A longer key, for example `a.b.c.d.e`, is still
        broken into four parts, but the remaining pieces are in the last part:
        `a`, `b`, `c` and `d.e`.

        Each of these peices has a short hash computed (the first 16 characters
        of its SHA256 hash in hex), and is joined into a single address, with
        the config namespace (`000000`) added at the beginning.

        Args:
            key (str): the setting key
        Returns:
            str: the computed address