Skip to contentSkip to conversation

codeparser: Use hashlib for hashing, not hash()

PATCH In review Richard Purdie 2 participants 3 messages Jun 3, 2016

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 codeparser: Use hashlib for hashing, not hash()

"hash() is randomised by default each time you start a new instance of recent
versions (Python3.3+) to prevent dictionary insertion DOS attacks"

which means we need to use hashlib.md5 to get consistent values for the codeparser cache under python 3. Prior to this, the codeparser cache was effectively useless under python3 as shown by performance regressions.

(quoted diff) +0 -0

b/bitbake/lib/bb/codeparser.py
index b1d067a..00551ba 100644

bitbake/lib/bb/codeparser.py +4 -0
@@ -6,12 +6,16 @@ import pickle
 import bb.pysh as pysh
 import os.path
 import bb.utils, bb.data
+import hashlib
 from itertools import chain
 from bb.pysh import pyshyacc, pyshlex, sherrors
 from bb.cache import MultiProcessCache
 
 logger = logging.getLogger('BitBake.CodeParser')
 
+def bbhash(s):
+    return hashlib.md5(s.encode("utf-8")).hexdigest()
+
 def check_indent(codestr):
     """If the code is indented, add a top level piece of code to

'remove' the indentation"""

@@ -269,7 +273,7 @@ class PythonParser():
if not node or not node.strip():
return

- h = hash(str(node))
+ h = bbhash(str(node))

if h in codeparsercache.pythoncache:
self.references = set(codeparsercache.pythoncache[h].refs)
@@ -314,7 +318,7 @@ class ShellParser():
commands it executes.
"""

- h = hash(str(value))
+ h = bbhash(str(value))

if h in codeparsercache.shellcache:
self.execs = set(codeparsercache.shellcache[h].execs)

#1 lore raw
Quoted 11 lines · Richard Purdie

"hash() is randomised by default each time you start a new instance of recent
versions (Python3.3+) to prevent dictionary insertion DOS attacks"

which means we need to use hashlib.md5 to get consistent values for the codeparser cache under python 3. Prior to this, the codeparser cache was effectively useless under python3 as shown by performance regressions.

Looks good to me, I was actually wondering about the hashing mechanisms just yesterday. Are the sstate checksums stable between python 2 and python 3?

Signature · 5 lines
Christopher Larson
clarson at kergoth dot com
Founder - BitBake, OpenEmbedded, OpenZaurus
Maintainer - Tslib
Senior Software Engineer, Mentor Graphics
#2 lore raw
Quoted 13 lines · Christopher Larson
Quoted 10 lines · Richard Purdie

"hash() is randomised by default each time you start a new instance of
recent
versions (Python3.3+) to prevent dictionary insertion DOS attacks"

which means we need to use hashlib.md5 to get consistent values for the codeparser cache under python 3. Prior to this, the codeparser cache was effectively useless under python3 as shown by performance regressions.

Quoted 5 lines
Quoted 2 lines

Looks good to me, I was actually wondering about the hashing mechanisms just yesterday. Are the sstate checksums stable between python 2 and python 3?

I've not actually checked, we didn't intentionally break anything. It doesn't actually matter that much since the python code between the two is different and hence the checksums will change...

Cheers,

Richard