Portál AbcLinuxu, 30. dubna 2025 15:25
Python jakožto virtuální mašina není deterministický. Obvyklým zdrojem nahodilosti je plánování vláken, v Pythonu ale můžete mít korektní jednovláknový program, který vám dá pro jeden vstup pokaždé jiné výsledky. Může za to hashování, hash objektu může být odvozen od jeho adresy v paměti, což je (stejně jako rozvrhování vláken) neuchopitelná záležitost o kterou se stará operační systém.
Já jsem na tuhle vlastnost narazil v momentě, kdy jsem před sebou měl program, který jako klíč k hashovací tabulce používal objekt funkce. Na jiném místě program tabulku sekvenčně procházel, jenže pořadí položek se mezi jednotlivými běhy měnilo.
Existují implementace hash-tabulek, které tímto problémem netrpí. Bohužel, zmiňovaný program je tak velká a složitá bestie, že jsem musel zvolit alternativní přístup: upravit samotný interpret Pythonu.
Patch je to jednoduchý, brutální, ale funkční:
--- Python-2.4.4/Objects/object.c 2006-04-12 19:06:58.000000000 +0200 +++ /home/paskma/B/src/Python-2.4.4/Objects/object.c 2009-03-20 10:01:29.000000000 +0100 @@ -984,6 +984,8 @@ long _Py_HashPointer(void *p) { + return 1; + #if SIZEOF_LONG >= SIZEOF_VOID_P return (long)p; #else
Pochopitelně tenhle hack může sabotovat výkon, v mém případě to ale program příliš nezpomalilo, tahle funkce se používá až když není zbytí.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.