]> granicus.if.org Git - postgis/commitdiff
fix for 32-bit hash
authorRegina Obe <lr@pcorp.us>
Mon, 1 Jul 2019 18:15:25 +0000 (18:15 +0000)
committerRegina Obe <lr@pcorp.us>
Mon, 1 Jul 2019 18:15:25 +0000 (18:15 +0000)
Closes #4433
Closes https://github.com/postgis/postgis/pull/429

git-svn-id: http://svn.osgeo.org/postgis/trunk@17575 b70326c6-7e19-0410-871a-916f4a2858ee

NEWS
liblwgeom/gserialized.c
liblwgeom/gserialized.h
liblwgeom/gserialized1.c
liblwgeom/gserialized1.h
liblwgeom/gserialized2.c
liblwgeom/gserialized2.h
liblwgeom/liblwgeom.h.in
postgis/lwgeom_btree.c

diff --git a/NEWS b/NEWS
index e1afbd5d3514d5116b5f21d868fb24b38ba3d265..032eee844cb6715f43f120136b78fe8bd78efef8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,11 @@
 PostGIS 3.0.0alpha4
-comming next
+2019/xx/xx
+For full changes and enhancements, refer to PostGIS 3.0.0.
+This version requires PostgreSQL 9.5+-12 and GEOS >= 3.6+
+Additional features enabled if you are running Proj6+ and PostgreSQL 12
+
+* Major highlights *
+  - #4433 32-bit hash fix (requires reindexing your data if on 32-bit OS) (Raúl Marín)
 
 
 PostGIS 3.0.0alpha3
index 213bbecd6cd1b2d6d30daf6d110d180eb34eb603..6998f13cc0e67abb863dd995957499fc29f2069f 100644 (file)
@@ -110,7 +110,8 @@ uint32_t gserialized_max_header_size(void)
 * in the GSERIALIZED. Ignores metadata like flags and optional
 * boxes, etc.
 */
-uint64_t gserialized_hash(const GSERIALIZED *g)
+int32_t
+gserialized_hash(const GSERIALIZED *g)
 {
        if (GFLAGS_GET_VERSION(g->gflags))
                return gserialized2_hash(g);
index 66847fd2b5cf67ebe237f0b7d1e419bd351471ed..a9d48c8bc3a5cf03a6aa4b97cfe9063ca3fc07a9 100644 (file)
@@ -75,7 +75,7 @@ extern uint32_t gserialized_max_header_size(void);
 * in the GSERIALIZED. Ignores metadata like flags and optional
 * boxes, etc.
 */
-extern uint64_t gserialized_hash(const GSERIALIZED *g);
+extern int32_t gserialized_hash(const GSERIALIZED *g);
 
 /**
 * Extract the SRID from the serialized form (it is packed into
index 69b1a24ed001ff948bb582908a397769eb23cc3e..e0a30188d373ddaf620cdbac0142c72e149be0ba 100644 (file)
@@ -221,11 +221,11 @@ int gserialized1_is_empty(const GSERIALIZED *g)
 /* pb = IN: secondary initval, OUT: secondary hash */
 void hashlittle2(const void *key, size_t length, uint32_t *pc, uint32_t *pb);
 
-
-uint64_t gserialized1_hash(const GSERIALIZED *g1)
+int32_t
+gserialized1_hash(const GSERIALIZED *g1)
 {
-       uint64_t hval;
-       uint32_t pb = 0, pc = 0;
+       int32_t hval;
+       int32_t pb = 0, pc = 0;
        /* Point to just the type/coordinate part of buffer */
        size_t hsz1 = gserialized1_header_size(g1);
        uint8_t *b1 = (uint8_t*)g1 + hsz1;
@@ -241,9 +241,9 @@ uint64_t gserialized1_hash(const GSERIALIZED *g1)
        /* Copy type/coordinates into rest of combined buffer */
        memcpy(b2+sizeof(int), b1, bsz1);
        /* Hash combined buffer */
-       hashlittle2(b2, bsz1, &pb, &pc);
+       hashlittle2(b2, bsz2, (uint32_t *)&pb, (uint32_t *)&pc);
        lwfree(b2);
-       hval = pc + (((uint64_t)pb)<<32);
+       hval = pb ^ pc;
        return hval;
 }
 
index 04c9d6302571f6a8652b3be60493598290735883..0f792b8ae5ce168546452ae3c6c1f7d591525b84 100644 (file)
@@ -86,7 +86,7 @@ uint32_t gserialized1_max_header_size(void);
 * in the GSERIALIZED. Ignores metadata like flags and optional
 * boxes, etc.
 */
-uint64_t gserialized1_hash(const GSERIALIZED *g);
+int32_t gserialized1_hash(const GSERIALIZED *g);
 
 /**
 * Extract the SRID from the serialized form (it is packed into
index 9280ca0588e12f509932b70bd08051d579fc3807..3e2e65a0b766c0417a9f481362865389227ddada 100644 (file)
@@ -252,19 +252,19 @@ int gserialized2_is_empty(const GSERIALIZED *g)
 /* pb = IN: secondary initval, OUT: secondary hash */
 void hashlittle2(const void *key, size_t length, uint32_t *pc, uint32_t *pb);
 
-
-uint64_t gserialized2_hash(const GSERIALIZED *g)
+int32_t
+gserialized2_hash(const GSERIALIZED *g1)
 {
-       uint64_t hval;
-       uint32_t pb = 0, pc = 0;
+       int32_t hval;
+       int32_t pb = 0, pc = 0;
        /* Point to just the type/coordinate part of buffer */
-       size_t hsz1 = gserialized2_header_size(g);
-       uint8_t *b1 = (uint8_t*)g + hsz1;
+       size_t hsz1 = gserialized2_header_size(g1);
+       uint8_t *b1 = (uint8_t *)g1 + hsz1;
        /* Calculate size of type/coordinate buffer */
-       size_t sz1 = SIZE_GET(g->size);
+       size_t sz1 = SIZE_GET(g1->size);
        size_t bsz1 = sz1 - hsz1;
        /* Calculate size of srid/type/coordinate buffer */
-       int32_t srid = gserialized2_get_srid(g);
+       int32_t srid = gserialized2_get_srid(g1);
        size_t bsz2 = bsz1 + sizeof(int);
        uint8_t *b2 = lwalloc(bsz2);
        /* Copy srid into front of combined buffer */
@@ -272,9 +272,9 @@ uint64_t gserialized2_hash(const GSERIALIZED *g)
        /* Copy type/coordinates into rest of combined buffer */
        memcpy(b2+sizeof(int), b1, bsz1);
        /* Hash combined buffer */
-       hashlittle2(b2, bsz1, &pb, &pc);
+       hashlittle2(b2, bsz2, (uint32_t *)&pb, (uint32_t *)&pc);
        lwfree(b2);
-       hval = pc + (((uint64_t)pb)<<32);
+       hval = pb ^ pc;
        return hval;
 }
 
index b8d8834d67dfda4b400f4fb8990d9f95132a2ba7..2685bbee0f3e0fe1e400d3e33832c8549ebf954d 100644 (file)
@@ -93,7 +93,7 @@ uint32_t gserialized2_max_header_size(void);
 * in the GSERIALIZED. Ignores metadata like flags and optional
 * boxes, etc.
 */
-uint64_t gserialized2_hash(const GSERIALIZED *g);
+int32_t gserialized2_hash(const GSERIALIZED *g);
 
 /**
 * Extract the SRID from the serialized form (it is packed into
index 9032f5c27008d442600b7970d11bc334d2510b3b..68fb5f6eadb441e29afc863f20fc8052c53373c9 100644 (file)
@@ -735,7 +735,7 @@ extern uint32_t gserialized_max_header_size(void);
 * in the GSERIALIZED. Ignores metadata like flags and optional
 * boxes, etc.
 */
-extern uint64_t gserialized_hash(const GSERIALIZED *g);
+extern int32_t gserialized_hash(const GSERIALIZED *g);
 
 /**
 * Extract the SRID from the serialized form (it is packed into
index 66c1573e0e77cd21e8631f7b8fd3c4d2585b6ef3..6c11445edc218e3c0d17390659a6dc865af31e2b 100644 (file)
@@ -131,9 +131,9 @@ PG_FUNCTION_INFO_V1(lwgeom_hash);
 Datum lwgeom_hash(PG_FUNCTION_ARGS)
 {
        GSERIALIZED *g1 = PG_GETARG_GSERIALIZED_P(0);
-       uint64_t hval = gserialized_hash(g1);
+       int32_t hval = gserialized_hash(g1);
        PG_FREE_IF_COPY(g1, 0);
-       PG_RETURN_DATUM(Int64GetDatum(hval));
+       PG_RETURN_INT32(hval);
 }