【问题标题】:Converting a number string into MD5 with python使用python将数字字符串转换为MD5
【发布时间】:2012-06-21 20:36:10
【问题描述】:

受 XKCD geohashing 漫画 (http://imgs.xkcd.com/comics/geohashing.png) 的启发,我想我应该尝试用 Python 编写生成器。不过,我已经用它的主要部分打了一个块:转换为 MD5,然后转换为十进制。

有可能吗?

【问题讨论】:

    标签: python md5 geohashing


    【解决方案1】:

    编辑:看漫画后这里是XKCD geohashing更完整的解决方案:

    >>> md5 = hashlib.md5('2005-05-26-10458.68').hexdigest()     # get MD5 as hex string
    >>> float.fromhex('0.' + md5[:16])                           # first half as float
    0.85771326770700229
    >>> float.fromhex('0.' + md5[16:])                           # second half as float
    0.54454306955928211
    

    以下是“先转换为 MD5,然后再转换为十进制”的更一般的答案:

    假设您想要字符串'hello world' 的十进制MD5,您可以使用以下内容:

    >>> int(hashlib.md5('hello world').hexdigest(), 16)
    125893641179230474042701625388361764291L
    

    hash.hexdigest() 函数返回一个十六进制字符串,int(hex_str, 16) 是您可以使用convert a hexadecimal string to a decimal 的方式。

    【讨论】:

    • 天哪。这比我想象的要复杂得多……嗯。必须奋发向上。如果我可能会问,[:16] 和 [16:] 如何获取 MD5 字符串的两个独立部分?
    • @dantdj,这叫做切片,你可以找到一些关于它的好资料here。基本上是[start:stop:step],其中最后的冒号和步骤是可选的。 [:16] 表示取前 16 个字符,[16:] 表示取第 17 个字符(因为从零开始的索引)到结尾的所有字符。
    • 啊,当然!我想知道为什么选择16。当它像这样摆在你面前时,一切都开始变得有点明显了。 :)
    【解决方案2】:

    这里有一个线索 - 它对 the example image 进行编码并生成您将在那里找到的数字。

    >>> from hashlib import md5
    >>> hash = md5("2005-05-26-10458.68").hexdigest()
    >>> hash
    'db9318c2259923d08b672cb305440f97'
    >>> int(hash[:16],16)/16.**16
    0.8577132677070023
    >>> int(hash[16:],16)/16.**16
    0.5445430695592821
    >>> 
    

    【讨论】:

    • 谢谢!不得不砍掉和改变一点,但我现在有一个基本版本。只需删除多余的小数点即可。
    【解决方案3】:

    使用int('db931', 16) 将十六进制(base-16)字符串db931 转换为十进制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-27
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多