Генерация хорошего хеша легче сказать чем сделать. Помните, Вы в основном представляете n байты данных с m битами информации. Чем больше Ваш набор данных и меньший m, тем более вероятно Вы получите коллизию... две части данных, решающих к тому же хешу.
самым простым хешем, который я когда-либо изучал, был просто XORing все байты вместе. Это легко, быстрее, чем большинство сложных хеш-алгоритмов и промежуточный достойный хеш-алгоритм общего назначения для небольших наборов данных. Это - Пузырьковая сортировка хеш-алгоритмов действительно. Так как простая реализация оставила бы Вас с 8 битами, это - только 256 хешей... не настолько горячих. Вы могли блоки XOR вместо individal байтов, но тогда алгоритм становится намного более сложным.
Поэтому, конечно, криптографические алгоритмы, возможно, делают некоторый материал, в котором Вы не нуждаетесь..., но они - также огромный шаг в качестве хеша общего назначения. Хеш MD5, который Вы используете, имеет 128 битов с миллиардами и миллиардами возможных хешей. Единственным путем Вы, вероятно, доберетесь, что-то лучше должно взять некоторые репрезентативные пробы данных, которые Вы ожидаете проходить свое приложение и пробовать различные алгоритмы на нем для наблюдения, сколько коллизий Вы добираетесь.
Поэтому, пока я не вижу некоторых оснований для не использования консервированного хеш-алгоритма (производительность, возможно?), я оказываюсь перед необходимостью рекомендовать придерживаться с тем, что Вы имеете.
чтение из большого примера на первой странице веб-сайта Mechanize :
# Sometimes it's useful to process bad headers or bad HTML:
response = br.response() # this is a copy of response
headers = response.info() # currently, this is a mimetools.Message
headers["Content-type"] = "text/html; charset=utf-8"
response.set_data(response.get_data().replace("<!---", "<!--"))
br.set_response(response)
так что кажется вполне возможным предварительно обработать ответ другим синтаксическим анализатором, который будет хорошо регенерировать- сформировал HTML, а затем передал его обратно для механизации для дальнейшей обработки.
То, что вы ищете, можно сделать с помощью lxml.etree
, который представляет собой эмулятор xml.etree.ElementTree
(и замену), предоставленный lxml
:
Сначала мы берем неверный неверно сформированный HTML:
% cat bad.html
<html>
<HEAD>
<TITLE>this HTML is awful</title>
</head>
<body>
<h1>THIS IS H1</H1>
<A HREF=MYLINK.HTML>This is a link and it is awful</a>
<img src=yay.gif>
</body>
</html>
(обратите внимание на смешанный регистр между открывающими и закрывающими тегами, отсутствием кавычек).
А затем проанализируем его:
>>> from lxml import etree
>>> bad = file('bad.html').read()
>>> html = etree.HTML(bad)
>>> print etree.tostring(html)
<html><head><title>this HTML is awful</title></head><body>
<h1>THIS IS H1</h1>
<a href="MYLINK.HTML">This is a link and it is awful</a>
<img src="yay.gif"/></body></html>
Обратите внимание, что теги и цитата были исправлены для нас.
Если у вас раньше были проблемы с синтаксическим анализом HTML, возможно, это ответ, который вы ищете. Что касается деталей HTTP, это совсем другое дело.