返回 32(或 64)位的 python 哈希函数

2024-03-03

我正在寻找一个返回 32(或 64)位的哈希函数。我尝试了 hashlib 中的 md5。例如:

import hashlib
hashlib.md5(b"H").hexdigest()

gives

c1d9f50f86825a1a2302ec2449c17196

如果没有这样的哈希函数,是否可以从哈希中提取前32位?我试过:

st = hashlib.md5(b"H").hexdigest()
' '.join(format(x, 'b') for x in bytearray(st, 'utf-8'))

将哈希转换为二进制,但它给出:

'1100011 110001 1100100 111001 1100110 110101 110000 1100110 111000 110110 111000 110010 110101 1100001 110001 1100001 110010 110011 110000 110010 1100101 1100011 110010 110100 110100 111001 1100011 110001 110111 110001 111001 110110'

这不可能是正确的,因为它们都是以两个开始的。


下面我提供了四种获取 32/64 位哈希值的解决方案:整数、字节、十六进制、位(二进制字符串)。

作为十进制整数(大端):

在线尝试一下! https://tio.run/##K6gsycjPM/7/PzO3IL@oRCEjsTgjJzOJq6AoM69EA4j10oryc@OTKktSizWgknrFGYlGpmYaSUoeSpp6KZnpqcUlGprRViaxOgrqOZklJTmp6pqaCsoKxka6SZklZJllgW6WmQnIrP//AQ

import hashlib
print(int.from_bytes(hashlib.sha256(b"H").digest()[:4], 'little')) # 32-bit int
print(int.from_bytes(hashlib.sha256(b"H").digest()[:8], 'little')) # 64-bit int

Output:

3866803524
12578350417885969732

不使用整数来获取小端顺序的字节,而是执行以下操作:

在线尝试一下! https://tio.run/##K6gsycjPM/7/PzO3IL@oRCEjsTgjJzOJq6AoM69EA8rTK85INDI100hS8lDS1EvJTE8tLtHQjLYyidVUUFYwNtJNyizRUTBRSKosSS0mTqsFWKuZCUSrBUTr//8A

import hashlib
print(hashlib.sha256(b"H").digest()[:4]) # 32-bit, 4 bytes
print(hashlib.sha256(b"H").digest()[:8]) # 64-bit, 8 bytes

Output:

b'D\xbdz\xe6'
b'D\xbdz\xe6\x0fG\x8f\xae'

也可以获得 32/64 位十六进制值。第一个变体为小端十六进制字节:

在线尝试一下! https://tio.run/##K6gsycjPM/7/PzO3IL@oRCEjsTgjJzOJq6AoM69EA8rTK85INDI100hS8lDS1MtIrUjJTE8tLtHQjLayUIjVVFBWMDbSTcos0VGwUFAASiskZyQWFRNthqEZ2AwzE4gZhmYIM/7/BwA

import hashlib
print(hashlib.sha256(b"H").hexdigest()[:8 ]) # 32-bit, 8  hex chars
print(hashlib.sha256(b"H").hexdigest()[:16]) # 64-bit, 16 hex chars

Output:

44bd7ae6
44bd7ae60f478fae

第二个变体为十六进制数字(大端):

在线尝试一下! https://tio.run/##K6gsycjPM/7/PzO3IL@oRCEjsTgjJzOJq6AoM69EIyO1QgNI66UV5efGJ1WWpBZrQBXoFWckGpmaaSQpeShp6qVkpqcWl2hoRluZxOooqOdklpTkpKpramoqKCsYG@kmZZYoAI0h21ALDEPNTGCG/v8PAA

import hashlib
print(hex(int.from_bytes(hashlib.sha256(b"H").digest()[:4], 'little'))) # 32-bit int
print(hex(int.from_bytes(hashlib.sha256(b"H").digest()[:8], 'little'))) # 64-bit int

Output:

0xe67abd44
0xae8f470fe67abd44

如果需要,您甚至可以获得位(二进制字符串)。这里的位的计数正好是 32 和 64,并以大端顺序表示。

在线尝试一下! https://tio.run/##K6gsycjPM/7/PzO3IL@oRCEjsTgjJzOJq6AoM69EIykzTwNI66UV5efGJ1WWpBZrQBXoFWckGpmaaSQpeShp6qVkpqcWl2ho6iio52SWlOSkqmtqRusaG1lZxWoqKCsYG@kmZZZQxUwzE6iZZiYgM///BwA

import hashlib
print(bin(int.from_bytes(hashlib.sha256(b"H").digest(), 'little'))[-32:]) # 32-bit
print(bin(int.from_bytes(hashlib.sha256(b"H").digest(), 'little'))[-64:]) # 64-bit

Output:

11100110011110101011110101000100
1010111010001111010001110000111111100110011110101011110101000100

如果你想计算二进制表示中前导零的数量,那么你可以这样做:

在线尝试一下! https://tio.run/##LYkxCoAwEAR7X7HdJWiRYJ3HWJx4hZeQnKCvj0FcBoZhy2NH1rX3hgQKYzHEwe9AU6mi5pRvc4I9V8gChihYr5PrZuwaZlAkD9nHldIXvvcX

s = '000010110100101100'
print(next(i for i, e in enumerate(s + '1') if e == '1'))

Output:

4

不要忘记上面哈希的二进制表示是按大端顺序计算的,这意味着最高有效位位于最左边。如果您需要计算最低有效位侧的零位计数,请首先反转字符串,如下所示:

在线尝试一下! https://tio.run/##K6gsycjPM/7/v1jBVkHdAAgMDQyBCEobqHMVFGXmlWgUR1tZ6RrGav7/DwA

s = '000010110100101100'
print(s[::-1])

Output:

001101001011010000
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

返回 32(或 64)位的 python 哈希函数 的相关文章

随机推荐

  • C++:((A*)nullptr)->foo();合法吗?

    在深入研究 MFC 时 我发现了这段代码 AFXWIN INLINE HWND CWnd GetSafeHwnd const return this NULL NULL m hWnd 好像是这样使用的 CWnd pWnd nullptr p
  • 向左旋转 verilog 大小写

    我的任务是用verilog编写一个16位ALU 当我做需要旋转操作数和进行2的补码加法和减法的部分时 我发现了困难 我知道如何用纸和铅笔解决这个问题 但我无法弄清楚如何在 Verilog 中做到这一点 例如 A表示为a15 a14 a13
  • 字符串和标签本地化和全球化的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我是一个拥有 20 多名开发人员的团队的成员 每个开发人员都在一个单独的模块上工作 大约 10 个模块 在每个模块中 我们可能至少有 50 个
  • 如何安装依赖于另一个“目标项目”包的包?

    我在设置 yeoman 时遇到问题 当我尝试安装某些软件包 yeoman compass 时 我不断收到此错误 同时 其他软件包安装良好 git python 外部包不能依赖于目标项目的包 我不确定失败在哪里 但是 nuget 有一个长期存
  • 测试本地时清单中的代码库属性不匹配

    根据 Java 1 7u25 你应该添加Codebase归因于你的清单 我已经做到了 但现在我无法在本地测试它 因为属性值与我的本地 JNLP 由 Netbeans 生成 不匹配 它没有代码库值 清单的代码库应该有什么价值和 或我的 jnl
  • 反应式香蕉节流事件

    我想在reactive banana 中实现某种类型的事件限制 它应该工作 以便如果距最后一个事件通过的时间少于 delta 秒 则不会让事件通过 如果不让其通过 则会存储该事件 并在距离上次触发事件 delta 秒后触发 下面是一个为时间
  • 需要一种算法来像素化 n 维超球面

    我想将向量放入 n 维空间中 这可以通过对 n 维超球面的表面进行像素化来完成 有谁知道用 C 语言对超球面进行像素化有什么好的算法吗 我想要恒定的垃圾箱大小 我的空间仅由正整数组成 您需要您的垃圾箱完全规则吗 如果不是 则随机抛出点 并测
  • 按因子列安全合并数据框

    因子可以帮助防止 R 中的某些编程错误 您无法对使用不同级别的因子执行相等检查 并且在对无序因子执行大于 小于检查时会收到警告 a lt factor letters 1 3 b lt factor letters 1 3 levels l
  • Doctrine 2.0 select查询问题?

    我的朋友 我是 DOctrine 2 0 的新手 我已经配置了 但它不起作用 我有一张桌子 abctable 在数据库中 xyzdb id name age 1 Abc 23 2 Ijk 21 3 Mno 32 Table name abc
  • Visual Studio 装饰扩展事件未被触发

    我正在尝试为我的视觉工作室插件创建一个基本的装饰功能 我已经有一个工具窗口和一些命令设置 我正在尝试让 adronment 工作 按照此走过 https msdn microsoft com en us library ee818135 a
  • Django 1.9 import_module 的导入错误

    当尝试运行任一runserver or shell using manage py我得到一个ImportError例外 我正在使用 Django 1 9 ImportError No module named django utils im
  • Android安装-sdk manager.exe不起作用

    我从developer android com安装了适用于Windows的android SDK installer r08 windows exe 我安装到默认位置 C Program Files Android android sdk
  • Java Spring Boot 的 Docker 基础镜像(`FROM`)是什么?

    什么 Docker 基础镜像 FROM 对于 Java Spring Boot 应用程序 我刚刚开始使用 docker 我看到了FROM inside Dockerfile可以为Java定义图像 例如 FROM java 8 如果我使用 G
  • 405 不允许的方法

    我试图访问https api box com 2 0 files但我收到Expected status code in 200 299 got 405在我的回复中 来自 AFNetworking 在发送请求之前 我已从服务器获取了我的 au
  • Spring Security Oauth2 AuthenticationSuccessEvent 在每个请求时发布

    我正在使用 Spring Security Oauth2 来保护我的 Spring Boot REST 应用程序 我想在用户登录成功和失败后处理一些操作 问题是每个 当我使用用户不记名令牌发送请求时 AuthenticationSucces
  • 如何在Python中使用JSONDecoder?仅获取内部字典进行解码

    我有一个 JSONEncoder 和 JSONDecoder class SimpleTargetJSONEncoder json JSONEncoder converts a SimpleTarget to a Dict so it ca
  • 对象不支持张量流中的项目分配

    在之前的简单程序中 我无法执行简单的任务并收到以下错误 import tensorflow as tf x 1 tf constant 1 2 3 x 1 tf reshape x 1 shape 1 3 x 2 tf constant 2
  • SQLite UTF-8 编码

    我尝试运行脚本 read FILE 具有 UTF 8 字符串 我使用了 pragma 命令 PRAGMA encoding UTF 8 但我得到了错误的字符 如果我自己创建表并插入值 则一切正常 我应该怎么做才能正确运行脚本 顺便说一下 我
  • JMSi18nRoutingBundle 语言选择器

    我已经实现了以下语言切换器 ul if path app request attributes get route li a href ES a li li a href EN a li li a href IT a li else ul
  • 返回 32(或 64)位的 python 哈希函数

    我正在寻找一个返回 32 或 64 位的哈希函数 我尝试了 hashlib 中的 md5 例如 import hashlib hashlib md5 b H hexdigest gives c1d9f50f86825a1a2302ec244