【发布时间】:2012-06-21 20:36:10
【问题描述】:
受 XKCD geohashing 漫画 (http://imgs.xkcd.com/comics/geohashing.png) 的启发,我想我应该尝试用 Python 编写生成器。不过,我已经用它的主要部分打了一个块:转换为 MD5,然后转换为十进制。
有可能吗?
【问题讨论】:
标签: python md5 geohashing
受 XKCD geohashing 漫画 (http://imgs.xkcd.com/comics/geohashing.png) 的启发,我想我应该尝试用 Python 编写生成器。不过,我已经用它的主要部分打了一个块:转换为 MD5,然后转换为十进制。
有可能吗?
【问题讨论】:
标签: python md5 geohashing
编辑:看漫画后这里是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 的方式。
【讨论】:
[start:stop:step],其中最后的冒号和步骤是可选的。 [:16] 表示取前 16 个字符,[16:] 表示取第 17 个字符(因为从零开始的索引)到结尾的所有字符。
这里有一个线索 - 它对 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
>>>
【讨论】:
使用int('db931', 16) 将十六进制(base-16)字符串db931 转换为十进制。
【讨论】: