Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
6e628c49
Commit
6e628c49
authored
Mar 25, 2014
by
Damien George
Browse files
py: Replace naive and teribble hash function with djb2.
parent
ffb5cfc8
Changes
2
Hide whitespace changes
Inline
Side-by-side
py/makeqstrdata.py
View file @
6e628c49
...
@@ -18,9 +18,9 @@ codepoint2name[ord('/')] = 'slash'
...
@@ -18,9 +18,9 @@ codepoint2name[ord('/')] = 'slash'
# this must match the equivalent function in qstr.c
# this must match the equivalent function in qstr.c
def
compute_hash
(
qstr
):
def
compute_hash
(
qstr
):
hash
=
0
hash
=
5381
for
char
in
qstr
:
for
char
in
qstr
:
hash
+
=
ord
(
char
)
hash
=
(
hash
*
33
)
^
ord
(
char
)
return
hash
&
0xffff
return
hash
&
0xffff
def
do_work
(
infiles
):
def
do_work
(
infiles
):
...
...
py/qstr.c
View file @
6e628c49
...
@@ -18,7 +18,7 @@
...
@@ -18,7 +18,7 @@
// A qstr is an index into the qstr pool.
// A qstr is an index into the qstr pool.
// The data for a qstr contains (hash, length, data).
// The data for a qstr contains (hash, length, data).
// For now we use very simple encoding, just to get the framework correct:
// For now we use very simple encoding, just to get the framework correct:
// - hash is 2 bytes (s
imply the sum of data bytes
)
// - hash is 2 bytes (s
ee function below
)
// - length is 2 bytes
// - length is 2 bytes
// - data follows
// - data follows
// - \0 terminated (for now, so they can be printed using printf)
// - \0 terminated (for now, so they can be printed using printf)
...
@@ -28,10 +28,12 @@
...
@@ -28,10 +28,12 @@
#define Q_GET_LENGTH(q) ((q)[2] | ((q)[3] << 8))
#define Q_GET_LENGTH(q) ((q)[2] | ((q)[3] << 8))
#define Q_GET_DATA(q) ((q) + 4)
#define Q_GET_DATA(q) ((q) + 4)
// this must match the equivalent function in makeqstrdata.py
machine_uint_t
qstr_compute_hash
(
const
byte
*
data
,
uint
len
)
{
machine_uint_t
qstr_compute_hash
(
const
byte
*
data
,
uint
len
)
{
machine_uint_t
hash
=
0
;
// djb2 algorithm; see http://www.cse.yorku.ca/~oz/hash.html
machine_uint_t
hash
=
5381
;
for
(
const
byte
*
top
=
data
+
len
;
data
<
top
;
data
++
)
{
for
(
const
byte
*
top
=
data
+
len
;
data
<
top
;
data
++
)
{
hash
+=
*
data
;
hash
=
((
hash
<<
5
)
+
hash
)
^
(
*
data
);
// hash * 33 ^ data
}
}
return
hash
&
0xffff
;
return
hash
&
0xffff
;
}
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment