'The hash of the frame varies depending on the data available.
Our ideal scenario is the module name in addition to the line of
context. However, in several scenarios we opt for other approaches due
to platform constraints.
This is one of the few areas in Sentry that isn\'t platform-agnostic.'

def get_hash(self, platform=None):

    platform = (self.platform or platform)
    output = []
    if (self.filename == '[native    code]'):
        return output
    if self.module:
        if self.is_unhashable_module():
            output.append('<module>')
        else:
            output.append(remove_module_outliers(self.module))
    elif (self.filename and (not self.is_url()) and (not self.is_caused_by())):
        output.append(remove_filename_outliers(self.filename, platform))
    if (self.context_line is None):
        can_use_context = False
    elif (len(self.context_line) > 120):
        can_use_context = False
    elif (self.is_url() and (not self.function)):
        can_use_context = False
    elif (self.function and self.is_unhashable_function()):
        can_use_context = True
    else:
        can_use_context = True
    if can_use_context:
        output.append(self.context_line)
    elif (not output):
        return output
    elif self.symbol:
        output.append(self.symbol)
    elif self.function:
        if self.is_unhashable_function():
            output.append('<function>')
        else:
            output.append(remove_function_outliers(self.function))
    elif (self.lineno is not None):
        output.append(self.lineno)
    return output
