用python实现objective-c的NSString内hash函数

背景

objective-c语言,NSString内的hash函数,复杂的简直逆天了。因为工作需要,这里使用python3重新实现了一遍oc内的hash算法。也许能帮到大家。

代码

# coding: UTF-8

def __hash_next_four_uri_chars(chars, result):
    result = result * 67503105 + chars[0] * 16974593 + chars[1] * 66049 + chars[2] * 257 + chars[3]
    return result & 0xffffffffffffffff  # python不存在溢位,及时舍弃多余位


def __hash_nex_uri_char(char, result):
    result = result * 257 + char
    return result & 0xffffffffffffffff  # 及时舍弃多余位


def __hash_ios(s):
    """
    参考iOS源码https://github.com/opensource-apple/CF/blob/master/CFString.c
    """
    uContents = list(map(lambda x: ord(x), s))
    actualLen = len(uContents)
    result = actualLen
    if actualLen <= 96:  # HashEverythingLimit
        end4 = actualLen & (~3)
        end = actualLen
        pointer = 0
        while pointer < end4:
            result = __hash_next_four_uri_chars(uContents[pointer: pointer + 4], result)
            pointer += 4
        while pointer < end:
            result = __hash_nex_uri_char(uContents[pointer], result)
            pointer += 1
    else:
        for i in range(0, 8):
            result = __hash_next_four_uri_chars(uContents[i * 4:i * 4 + 4], result)
        con = (actualLen >> 1) - 16
        for i in range(0, 8):
            result = __hash_next_four_uri_chars(uContents[con + i * 4: con + i * 4 + 4], result)
        con = actualLen - 32
        for i in range(0, 8):
            result = __hash_next_four_uri_chars(uContents[con + i * 4: con + i * 4 + 4], result)

    result = result + (result << (actualLen & 31))
    return result & 0xffffffffffffffff


print(__hash_ios('abc'))
print(__hash_ios('abcdef'))
print(__hash_ios(
    'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'))

运行效果,与OC的结果对比

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值