blueloveTH 1 год назад
Родитель
Сommit
cd8ae22c2b
2 измененных файлов с 10 добавлено и 6 удалено
  1. 6 4
      src/modules/linalg.c
  2. 4 2
      tests/80_linalg.py

+ 6 - 4
src/modules/linalg.c

@@ -306,7 +306,9 @@ DEF_VECTOR_INT_OPS(3)
 static bool vec2i__hash__(int argc, py_Ref argv) {
     PY_CHECK_ARGC(1);
     c11_vec2i v = py_tovec2i(argv);
-    uint64_t hash = ((uint64_t)v.x << 32) | (uint64_t)v.y;
+    uint64_t x_part = (uint32_t)v.x & 0xFFFFFFFF;
+    uint64_t y_part = (uint32_t)v.y & 0xFFFFFFFF;
+    uint64_t hash = (x_part << 32) | y_part;
     py_newint(py_retval(), (py_i64)hash);
     return true;
 }
@@ -314,9 +316,9 @@ static bool vec2i__hash__(int argc, py_Ref argv) {
 static bool vec3i__hash__(int argc, py_Ref argv) {
     PY_CHECK_ARGC(1);
     c11_vec3i v = py_tovec3i(argv);
-    uint64_t x_part = (uint64_t)(v.x & 0xFFFFFF);
-    uint64_t y_part = (uint64_t)(v.y & 0xFFFFFF);
-    uint64_t z_part = (uint64_t)(v.z & 0xFFFF);
+    uint64_t x_part = (uint32_t)v.x & 0xFFFFFF;
+    uint64_t y_part = (uint32_t)v.y & 0xFFFFFF;
+    uint64_t z_part = (uint32_t)v.z & 0xFFFF;
     uint64_t hash = (x_part << 40) | (y_part << 16) | z_part;
     py_newint(py_retval(), (py_i64)hash);
     return true;

+ 4 - 2
tests/80_linalg.py

@@ -408,15 +408,17 @@ assert x == 3.0 and y == 4.0
 x, y, z = vec3(1.0, 2.0, 3.0)
 assert x == 1.0 and y == 2.0 and z == 3.0
 
+assert hash(vec2i(11, -1)) == 51539607551
+assert hash(vec3i(11, -1, 0)) == 13194139467776
 
 d = {vec2i(12, 12): 1035.313708305359, vec2i(12, 11): 2059.313708305359, vec2i(12, 13): 2059.313708305359, vec2i(11, 12): 2059.313708305359, vec2i(13, 12): 2059.313708305359, vec2i(13, 11): 3083.313708305359, vec2i(13, 13): 3083.313708305359, vec2i(14, 12): 3083.313708305359, vec2i(12, 14): 3083.313708305359, vec2i(11, 13): 3083.313708305359, vec2i(12, 10): 3083.313708305359, vec2i(11, 11): 3083.313708305359, vec2i(10, 12): 3083.313708305359, vec2i(13, 14): 4107.313708305359, vec2i(14, 13): 4107.313708305359, vec2i(14, 11): 4107.313708305359, vec2i(15, 12): 4107.313708305359, vec2i(12, 15): 4107.313708305359, vec2i(11, 14): 4107.313708305359, vec2i(13, 10): 4107.313708305359, vec2i(10, 13): 4107.313708305359, vec2i(11, 10): 4107.313708305359, vec2i(10, 11): 4107.313708305359, vec2i(12, 9): 4107.313708305359, vec2i(9, 12): 4107.313708305359, vec2i(14, 14): 5131.313708305359, vec2i(15, 13): 5131.313708305359, vec2i(13, 15): 5131.313708305359, vec2i(15, 11): 5131.313708305359, vec2i(16, 12): 5131.313708305359, vec2i(12, 16): 5131.313708305359, vec2i(11, 15): 5131.313708305359, vec2i(14, 10): 5131.313708305359, vec2i(10, 14): 5131.313708305359, vec2i(13, 9): 5131.313708305359, vec2i(9, 13): 5131.313708305359}
 d[vec2i(11, 9)] = 1
 
 e = {}
-for i in range(10000):
+for i in range(-1000, 10000):
     e[vec2i(12, i)] = i
     e[vec2i(11, i)] = i
     e[vec2i(13, i)] = i
     e[vec2i(i, 12)] = i
     e[vec2i(i, 11)] = i
-    e[vec2i(i, 13)] = i
+    e[vec2i(i, 13)] = i