如何使用python获取字符串的MD5和?


262

Flickr API文档中,您需要找到字符串的MD5总和以生成[api_sig]值。

如何从字符串生成MD5和?

Flickr的示例:

串: 000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite

MD5总和: a02506b31c1cd46c2e0b6380fb94eb3d

Answers:


252

对于Python 2.x,请使用python的hashlib

import hashlib
m = hashlib.md5()
m.update("000005fab4534d05api_key9a0554259914a86fb9e7eb014e4e5d52permswrite")
print m.hexdigest()

输出: a02506b31c1cd46c2e0b6380fb94eb3d


77
不要尝试使用hashlib.md5().update('your string').hexdigest(),因为update()返回None ,它将不起作用。如果您需要单线解决方案,请使用Mark Longair的答案。
Christopher Manning

@ChristopherManning m.hexdigest()返回32个字符长的摘要。如何获取16个字符长的摘要?
阿迪尔·马利克

@Darwesh它是32个字符,因为它是十六进制表示形式,请m.digest_size在此代码的顶部执行操作,内部摘要已为16个字节。
Baris Demiray

1
@Darwesh,您可以简单地对字符串进行切片m.hexdigest()[:16]
fedterzi '16

@Darwesh根据RFC 1321,md5始终为16个字节。如果您只想要16个字符的摘要,则可以按照Baris Demiray所说的那样进行切片。
ryan

569

您可以执行以下操作:

Python 2.x

import hashlib
print hashlib.md5("whatever your string is").hexdigest()

Python 3.x

import hashlib
print(hashlib.md5("whatever your string is".encode('utf-8')).hexdigest())

但是,在这种情况下,最好使用这个有用的Python模块与Flickr API进行交互:

...将为您处理身份验证。

hashlib的官方文档


我看到了API。我只是很好奇我该怎么做。谢谢!
super9 2011年

1
hexdigest()返回32位字符的摘要。如何获取16个字符长的摘要?
阿迪尔·马利克

2
好答案!请问为什么在Python 2中我们不需要进行utf-8编码,但是在Python 3中我们需要进行编码。谢谢。@Mark Longair
Jeff Hu

3
@JeffHu,因为hashlib.md5需要一个类似字节的对象
MaxU

1
Python 3版本也应在Python 2中使用。@JeffHu扩展了@MaxU所说的内容,md5函数采用字节字符串,并且不接受unicode。Python 3是(正确)严格/显式的,因此str("")是unicode,必须编码为字节串。python2中的字符串可以解释为btyestring或unicode字符串,而传递str("")字符串则解释为字节字符串。如果字符串包含Unicode字符,则将引发Exception。编码字节串将使ascii字符保持不变,并正确转换unicode
Charles

11

您是否尝试在hashlib中使用MD5实现?请注意,哈希算法通常作用于二进制数据而不是文本数据,因此您可能需要注意哈希之前使用哪种字符编码将文本转换为二进制数据。

哈希的结果也是二进制数据-看起来Flickr的示例已使用十六进制编码转换为文本。使用hexdigesthashlib中的函数来获取此信息。


hexdigest()返回32位字符的摘要。如何获取16个字符长的摘要?
阿迪尔·马利克

1
@Darwesh:是的,MD5是128位,十六进制为32个字符。如果想要较小的摘要,则需要64位摘要。但是,那将是相当弱的……
乔恩·斯凯特

3
Try This 
import hashlib
user = input("Enter text here ")
h = hashlib.md5(user.encode())
h2 = h.hexdigest()
print(h2)

3

您可以b在字符串文字前面使用character

import hashlib
print(hashlib.md5(b"Hello MD5").hexdigest())
print(hashlib.md5("Hello MD5".encode('utf-8')).hexdigest())

出:

e5dadf6524624f79c3127e247f04b548
e5dadf6524624f79c3127e247f04b548

0

您可以尝试

#python3
import hashlib
rawdata = "put your data here"
sha = hashlib.sha256(str(rawdata).encode("utf-8")).hexdigest() #For Sha256 hash
print(sha)
mdpass = hashlib.md5(str(sha).encode("utf-8")).hexdigest() #For MD5 hash
print(mdpass)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.