PostGIS 3.0.6dev-r@@SVN_REVISION@@
Loading...
Searching...
No Matches

◆ gserialized2_hash()

int32_t gserialized2_hash ( const GSERIALIZED g)

Returns a hash code for the srid/type/geometry information in the GSERIALIZED.

Ignores metadata like flags and optional boxes, etc.

Definition at line 301 of file gserialized2.c.

302{
303 int32_t hval;
304 int32_t pb = 0, pc = 0;
305 /* Point to just the type/coordinate part of buffer */
306 size_t hsz1 = gserialized2_header_size(g1);
307 uint8_t *b1 = (uint8_t *)g1 + hsz1;
308 /* Calculate size of type/coordinate buffer */
309 size_t sz1 = SIZE_GET(g1->size);
310 size_t bsz1 = sz1 - hsz1;
311 /* Calculate size of srid/type/coordinate buffer */
312 int32_t srid = gserialized2_get_srid(g1);
313 size_t bsz2 = bsz1 + sizeof(int);
314 uint8_t *b2 = lwalloc(bsz2);
315 /* Copy srid into front of combined buffer */
316 memcpy(b2, &srid, sizeof(int));
317 /* Copy type/coordinates into rest of combined buffer */
318 memcpy(b2+sizeof(int), b1, bsz1);
319 /* Hash combined buffer */
320 hashlittle2(b2, bsz2, (uint32_t *)&pb, (uint32_t *)&pc);
321 lwfree(b2);
322 hval = pb ^ pc;
323 return hval;
324}
static size_t gserialized2_header_size(const GSERIALIZED *g)
int32_t gserialized2_get_srid(const GSERIALIZED *g)
Extract the SRID from the serialized form (it is packed into three bytes so this is a handy function)...
void hashlittle2(const void *key, size_t length, uint32_t *pc, uint32_t *pb)
Definition lookup3.c:476
void * lwalloc(size_t size)
Definition lwutil.c:227
void lwfree(void *mem)
Definition lwutil.c:242
#define SIZE_GET(varsize)
Macro for reading the size from the GSERIALIZED size attribute.

References gserialized2_get_srid(), gserialized2_header_size(), hashlittle2(), lwalloc(), lwfree(), GSERIALIZED::size, and SIZE_GET.

Referenced by gserialized_hash().

Here is the call graph for this function:
Here is the caller graph for this function: