class FindShortestID:
    __slots__ = 'short_id', 'new_id'

    def __init__(self):
        self.short_id = ''
        self.new_id = None

    def step(self, other_id, new_id):
        self.new_id = new_id
        for i in range(len(self.new_id)):
            if other_id[i] != self.new_id[i]:
                if i > len(self.short_id)-1:
                    self.short_id = self.new_id[:i+1]
                break

    def finalize(self):
        if self.short_id:
            return '#'+self.short_id


def register_canonical_functions(connection):
    connection.create_aggregate("shortest_id", 2, FindShortestID)