百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python 的hash 函数(python的hash函数)

itomcoil 2025-05-02 18:57 20 浏览

今天在看python的hash 函数源码的时候,发现针对不同的数据类型python 实现了不同的hash 函数,今天简单介绍源码中提到的hash 函数。(
https://github.com/python/cpython/blob/main/Python/pyhash.c)

  1. 针对short string 类型, python 用的是DJBX33A hash

DJBX33A是DJB(Daniel J. Bernstein)哈希函数的一种变体,专门设计用于快速计算和提供良好的分布特性, 我们来看一下DJBX33A

def djbX33A_hash(key):
    hash_value = 5381  # 初始哈希值

    for char in key:
        hash_value = (hash_value * 33) ^ ord(char)

    return hash_value

同时看一下DJB2 的实现

def djb2_hash(key):
    hash_value = 5381  # Initial hash value

    for char in key:
        hash_value = ((hash_value << 5) + hash_value) + ord(char)
    return hash_value

这个hash 函数用在很多的hashmap 的实现上

  1. 针对文件的hash, python使用的是FNV hash。 我们看一下FNV hash 的具体实现
def fnv_hash(key):
    FNV_PRIME_32 = 16777619
    FNV_OFFSET_32 = 2166136261

    hash_value = FNV_OFFSET_32

    for char in key:
        hash_value = (hash_value ^ ord(char)) * FNV_PRIME_32

    return hash_value
  1. 最后介绍python 默认的hash SipHash, 上面两种hash 函数都是相对不安全的,我们直接看代码
def siphash(key, message):
    c = 2
    d = 4
    v0 = 0x736f6d6570736575
    v1 = 0x646f72616e646f6d
    v2 = 0x6c7967656e657261
    v3 = 0x7465646279746573

    def rotl(x, b):
        return ((x << b) & 0xffffffffffffffff) | (x >> (64 - b))

    def sip_round():
        v0 += v1
        v1 = rotl(v1, 13)
        v1 ^= v0
        v0 = rotl(v0, 32)

        v2 += v3
        v3 = rotl(v3, 16)
        v3 ^= v2

        v0 += v3
        v3 = rotl(v3, 21)
        v3 ^= v0

        v2 += v1
        v1 = rotl(v1, 17)
        v1 ^= v2
        v2 = rotl(v2, 32)

    k0 = int.from_bytes(key[:8], 'little')
    k1 = int.from_bytes(key[8:16], 'little')

    m = len(message)
    last_chunk = m % 8
    b = m // 8 * 8

    v3 ^= k1
    v2 ^= k0
    v1 ^= k1
    v0 ^= k0

    for i in range(b // 8):
        mi = int.from_bytes(message[i*8:(i+1)*8], 'little')
        v3 ^= mi
        for _ in range(d):
            sip_round()
        v0 ^= mi

    mi = (last_chunk << 56) | int.from_bytes(message[b:], 'little')
    v3 ^= mi
    for _ in range(d):
        sip_round()
    v0 ^= mi

    v2 ^= 0xff

    for _ in range(c):
        sip_round()

    hash_value = v0 ^ v1 ^ v2 ^ v3

    return hash_value

最后我们给出python的PEP 456 – Secure and interchangeable hash algorithm | peps.python.orgFollowing system colour schemeSelected dark colour schemeSelected light colour scheme,这篇PEP可以很好的了解的python关于hash的具体事现,以及python的开发者是如何从众多的hash 函数中选择最优的hash function。

相关推荐

selenium(WEB自动化工具)

定义解释Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7,8,9,10,11),MozillaF...

开发利器丨如何使用ELK设计微服务中的日志收集方案?

【摘要】微服务各个组件的相关实践会涉及到工具,本文将会介绍微服务日常开发的一些利器,这些工具帮助我们构建更加健壮的微服务系统,并帮助排查解决微服务系统中的问题与性能瓶颈等。我们将重点介绍微服务架构中...

高并发系统设计:应对每秒数万QPS的架构策略

当面试官问及"如何应对每秒几万QPS(QueriesPerSecond)"时,大概率是想知道你对高并发系统设计的理解有多少。本文将深入探讨从基础设施到应用层面的解决方案。01、理解...

2025 年每个 JavaScript 开发者都应该了解的功能

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发。1.Iteratorhelpers开发者...

JavaScript Array 对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

Gemini 2.5编程全球霸榜,谷歌重回AI王座,神秘模型曝光,奥特曼迎战

刚刚,Gemini2.5Pro编程登顶,6美元性价比碾压Claude3.7Sonnet。不仅如此,谷歌还暗藏着更强的编程模型Dragontail,这次是要彻底翻盘了。谷歌,彻底打了一场漂亮的翻...

动力节点最新JavaScript教程(高级篇),深入学习JavaScript

JavaScript是一种运行在浏览器中的解释型编程语言,它的解释器被称为JavaScript引擎,是浏览器的一部分,JavaScript广泛用于浏览器客户端编程,通常JavaScript脚本是通过嵌...

一文看懂Kiro,其 Spec工作流秒杀Cursor,可移植至Claude Code

当Cursor的“即兴编程”开始拖累项目质量,AWS新晋IDEKiro以Spec工作流打出“先规范后编码”的系统工程思维:需求-设计-任务三件套一次生成,文档与代码同步落地,复杂项目不...

「晚安·好梦」努力只能及格,拼命才能优秀

欢迎光临,浏览之前点击上面的音乐放松一下心情吧!喜欢的话给小编一个关注呀!Effortscanonlypass,anddesperatelycanbeexcellent.努力只能及格...

JavaScript 中 some 与 every 方法的区别是什么?

大家好,很高兴又见面了,我是姜茶的编程笔记,我们一起学习前端相关领域技术,共同进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力在JavaScript中,Array.protot...

10个高效的Python爬虫框架,你用过几个?

小型爬虫需求,requests库+bs4库就能解决;大型爬虫数据,尤其涉及异步抓取、内容管理及后续扩展等功能时,就需要用到爬虫框架了。下面介绍了10个爬虫框架,大家可以学习使用!1.Scrapysc...

12个高效的Python爬虫框架,你用过几个?

实现爬虫技术的编程环境有很多种,Java、Python、C++等都可以用来爬虫。但很多人选择Python来写爬虫,为什么呢?因为Python确实很适合做爬虫,丰富的第三方库十分强大,简单几行代码便可实...

pip3 install pyspider报错问题解决

运行如下命令报错:>>>pip3installpyspider观察上面的报错问题,需要安装pycurl。是到这个网址:http://www.lfd.uci.edu/~gohlke...

PySpider框架的使用

PysiderPysider是一个国人用Python编写的、带有强大的WebUI的网络爬虫系统,它支持多种数据库、任务监控、项目管理、结果查看、URL去重等强大的功能。安装pip3inst...

「机器学习」神经网络的激活函数、并通过python实现激活函数

神经网络的激活函数、并通过python实现whatis激活函数感知机的网络结构如下:左图中,偏置b没有被画出来,如果要表示出b,可以像右图那样做。用数学式来表示感知机:上面这个数学式子可以被改写:...