前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >murmurhash2算法python3版本

murmurhash2算法python3版本

作者头像
全栈程序员站长
发布2022-11-02 15:23:50
4360
发布2022-11-02 15:23:50
举报
文章被收录于专栏:全栈程序员必看

在翻译加密代码时遇到这个murmurhash2算法了,网上找了几个现成的加密结果对不上,自己手动对照原加密翻译了一般python3版本的。

代码语言:javascript
复制
# -*- 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))

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/180585.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月18日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档