qstr, objstr: Make sure that valid hash != 0, treat 0 as "not computed".
This feature was proposed with initial hashing RFC, and is prerequisite for seamless static str object definition.
This commit is contained in:
parent
14de114ba8
commit
59e269cfec
@ -1463,7 +1463,8 @@ bool mp_obj_str_equal(mp_obj_t s1, mp_obj_t s2) {
|
|||||||
} else {
|
} else {
|
||||||
GET_STR_HASH(s1, h1);
|
GET_STR_HASH(s1, h1);
|
||||||
GET_STR_HASH(s2, h2);
|
GET_STR_HASH(s2, h2);
|
||||||
if (h1 != h2) {
|
// If any of hashes is 0, it means it's not valid
|
||||||
|
if (h1 != 0 && h2 != 0 && h1 != h2) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
GET_STR_DATA_LEN(s1, d1, l1);
|
GET_STR_DATA_LEN(s1, d1, l1);
|
||||||
|
@ -35,7 +35,12 @@ machine_uint_t qstr_compute_hash(const byte *data, uint len) {
|
|||||||
for (const byte *top = data + len; data < top; data++) {
|
for (const byte *top = data + len; data < top; data++) {
|
||||||
hash = ((hash << 5) + hash) ^ (*data); // hash * 33 ^ data
|
hash = ((hash << 5) + hash) ^ (*data); // hash * 33 ^ data
|
||||||
}
|
}
|
||||||
return hash & 0xffff;
|
hash &= 0xffff;
|
||||||
|
// Make sure that valid hash is never zero, zero means "hash not computed"
|
||||||
|
if (hash == 0) {
|
||||||
|
hash++;
|
||||||
|
}
|
||||||
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct _qstr_pool_t {
|
typedef struct _qstr_pool_t {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user