【问题标题】:what does the following line of code do?以下代码行是做什么的?
【发布时间】:2014-08-31 19:00:15
【问题描述】:
var=hashlib.md5(str(random.random())).hexdigest()[:16]

当我遇到上面的代码行时,我正在阅读 python 中的代码。 谁能解释一下上面的代码行是做什么的?

【问题讨论】:

  • 或许你可以试试执行那段代码看看?
  • 不知道 pyython 但我来了:获取一个随机字符串,用 md5 哈希它然后得到一个 16 长度的十六进制字符串 forums.udacity.com/questions/100116165/…\

标签: python python-2.7


【解决方案1】:

该行创建一个随机的 16 个字符的十六进制字符串。

  • random.random() 在 [0.0, 1.0) 范围内生成一个随机浮点值。

    >>> import random
    >>> random.random()
    0.845295579640289
    
  • str() 生成该随机值的字符串版本。

    >>> str(0.845295579640289)
    '0.84529557964'
    
  • hashlib.md5() 创建一个 MD5 message digest 哈希对象,用字符串值初始化。

    >>> hashlib.md5('0.84529557964')
    <md5 HASH object @ 0x10074c530>
    
  • hexdigest() method 然后生成哈希摘要,以十六进制表示。 MD5 算法产生 16 字节的信息,当以十六进制表示时,表示产生 32 个字符:

    >>> hashlib.md5('0.84529557964').hexdigest()
    '5180b52225eac65bee1d6419e28ef397'
    
  • [:16] 切片挑选出前 16 个字符。这一步是将摘要减半,只剩下 32 个字符中的前 16 个字符:

    >>> '5180b52225eac65bee1d6419e28ef397'[:16]
    '5180b52225eac65b'
    

总而言之,这是一种生成随机 16 个字符的十六进制值的相当冗长、低效且不安全的方法。我会改用os.urandom(),编码为十六进制:

>>> import os
>>> os.urandom(8).encode('hex')
'a8cb7b56d476b556'

这会产生一个随机的 8 字节字符串值,当以十六进制表示时,也会产生 16 个十六进制字符,完全随机。

我的 crypto-fu 不是那么好,但我的印象是后一种形式在密码学上比取一个浮点伪随机值字符串的一半 MD5 哈希值更强。

【讨论】:

  • @martijin pieters,什么是 md5?
  • @shubham 你的谷歌按钮坏了吗?
  • MD5 是散列算法。 @shubham
  • @shubham:我所做的只是向您展示这里的文档。 下次先自己查资料。
【解决方案2】:

md5 是一种加密-解密技术,它生成 128 位校验和并以文本格式的 32 位十六进制数表示。 所以hashlib.md5(str(random.random())).hexdigest() 会给你这个数字在一个字符串和 [:16] 将提取该哈希的前 16 位数字并将存储在 var 阅读这些参考资料了解更多详情。

Python Md5

Md5 Hash

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 2021-03-20
    • 2013-10-18
    • 1970-01-01
    相关资源
    最近更新 更多