[转]murmurhash2算法python3版本

原文链接:murmurhash2算法python3版本_murmurhash python_zwl_haley的博客-CSDN博客

# -*- coding: utf-8 -*-
# @ Time    : 2021/8/26 14:40
# @Note: Please do not use this program for illegal uses.
 
import ctypes
 
 
def unsigned_right_shitf(num, bit):
    return ctypes.c_uint32(num).value >> bit
 
 
def c_int32(int_num):
    return ctypes.c_int32(int_num).value
 
 
def murmurhash2(e, timestamp):
    array_len = len(e)
    f = c_int32(timestamp ^ array_len)
    o = 0
    while array_len >= 4:
        v2 = c_int32(255 & e[o])
        o += 1
        v3 = c_int32((c_int32(255 & e[o])) << 8)
        o += 1
        v4 = c_int32((c_int32(255 & e[o])) << 16)
        o += 1
        v5 = c_int32(c_int32((255 & e[o])) << 24)
        n = c_int32(c_int32(c_int32(v2 | v3) | v4) | v5)
        v1 = c_int32(65535 & n)
        n = 1540483477 * v1 + c_int32((c_int32(1540483477 * (c_int32(n >> 16)) & 65535)) << 16)
 
        n = c_int32(c_int32(n) ^ c_int32(unsigned_right_shitf(n, 24)))
        n = 1540483477 * (c_int32(65535 & n)) + c_int32((c_int32(1540483477 * (c_int32(n >> 16)) & 65535)) << 16)
 
        j1 = 1540483477 * (c_int32(65535 & f))
        j2 = c_int32((1540483477 * (c_int32(f >> 16)) & 65535) << 16)
        f = c_int32((j1 + j2) ^ n)
 
        o += 1
        array_len -= 4
    f = c_int32(f)
 
    def case1(ff):
        ff = c_int32(ff ^ (c_int32(255 & e[o])))
        return 1540483477 * (c_int32(65535 & ff)) + c_int32((c_int32(1540483477 * (c_int32(ff >> 16)) & 65535)) << 16)
 
    def case2(ff):
        return c_int32(ff ^ c_int32((c_int32(255 & e[o + 1])) << 8))
 
    def case3(ff):
        return c_int32(ff ^ c_int32((c_int32(255 & e[o + 2])) << 16))
 
    if array_len == 1:
        f = case1(f)
    if array_len == 2:
        f = case1(case2(f))
    if array_len == 3:
        f = case1(case2(case3(f)))
 
    f = c_int32(f ^ unsigned_right_shitf(f, 13))
    f = 1540483477 * (c_int32(65535 & f)) + c_int32((c_int32(1540483477 * unsigned_right_shitf(f, 16) & 65535)) << 16)
    f = c_int32(f ^ unsigned_right_shitf(f, 15))
    print("result:", f)
    return c_int32(unsigned_right_shitf(f, 0) ^ 1540483477)
 
 
 
if __name__ == '__main__':
    murmurhash2(list(b'123abc'), int(time.time()*1000))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python 中的字典是一种基于哈希表实现的高效数据结构,它支持快速插入、查找和删除操作。下面简要介绍 Python 字典底层的实现原理。 1. 哈希表 Python 字典的底层实现基于哈希表,它是一种由数组和链表组成的数据结构。哈希表的基本思想是将每个键值对映射到一个唯一的位置,这个位置称为哈希桶,通过哈希桶可以快速查找、插入和删除键值对。 在 Python 中,哈希桶通过一个数组来实现,每个元素都是一个指向链表头部的指针,这个链表中存储了哈希值相同的键值对。当哈希表中的键值对数量增加时,可以动态地扩容哈希表,以保证哈希桶的利用率。 2. 哈希函数 哈希函数是将键值对映射到哈希桶的关键,它需要满足以下两个条件: - 相同的键值对应相同的哈希桶; - 不同的键尽可能映射到不同的哈希桶。 在 Python 中,哈希函数使用的是一种称为 MurmurHash算法,它能够快速计算出任意长度的输入数据的哈希值,并且哈希值的分布比较均匀,能够尽可能地避免哈希冲突。 3. 冲突处理 由于哈希函数的映射是有限的,因此不同的键值对可能会映射到同一个哈希桶中,这种情况称为哈希冲突。Python 中的哈希表通过链表来处理哈希冲突,同一个哈希桶中的键值对会被存储在一个链表中,当出现哈希冲突时,新的键值对会被插入到链表的头部,这样就能够保证查找时优先找到最近插入的键值对。 4. 字典的操作复杂度 Python 字典的操作复杂度与字典中键值对的数量和哈希桶的利用率有关。在哈希桶的利用率比较低时,字典的操作复杂度接近于常数级别,即 $O(1)$,这是由于哈希桶的利用率越低,哈希冲突的概率就越低,查找、插入和删除操作的时间复杂度也就越低。在哈希桶的利用率比较高时,字典的操作复杂度会逐渐接近于线性级别,即 $O(n)$,这是由于哈希冲突的概率增加,需要查找更多的链表节点才能找到目标键值对。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小金子的夏天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值