Change the float hashing
This commit is contained in:
		
							parent
							
								
									4bd9a4556f
								
							
						
					
					
						commit
						d42dcc4a07
					
				@ -65,7 +65,7 @@ typedef vtype_hash   hash_t;
 | 
			
		||||
extern int libcdsb_vtype_compare_values(const void* s0, vtype t0, const void* s1, vtype t1);
 | 
			
		||||
extern int libcdsb_vtype_compare_values_eq(const void* s0, const void* s1, vtype t);
 | 
			
		||||
 | 
			
		||||
extern hash_t libcdsb_vtype_hash(void* value, vtype type);
 | 
			
		||||
extern hash_t libcdsb_vtype_hash(const void* value, vtype type);
 | 
			
		||||
 | 
			
		||||
#define vtype_stringify libcdsb_vtype_stringify
 | 
			
		||||
#define vtype_name      libcdsb_vtype_name
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										38
									
								
								src/vtype.c
									
									
									
									
									
								
							
							
						
						
									
										38
									
								
								src/vtype.c
									
									
									
									
									
								
							@ -31,14 +31,32 @@ static ldbl_t normalize_value(const void* v, vtype t) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static hash_t ldouble_hash(ldbl_t s) {
 | 
			
		||||
    hash_t x, y;
 | 
			
		||||
    ldbl_t m;
 | 
			
		||||
    hash_t hash;
 | 
			
		||||
 | 
			
		||||
    m = modfl(s, &s);
 | 
			
		||||
    x = llrintl(s);
 | 
			
		||||
    y = floorl(m * 10000);
 | 
			
		||||
    if (sizeof(hash_t) == sizeof(u64_t)) {
 | 
			
		||||
        if (is_little_endian) {
 | 
			
		||||
            hash  = *((u64_t*)&s);
 | 
			
		||||
            hash ^= *((u16_t*)(((u64_t*)&s) + 1));
 | 
			
		||||
        } else {
 | 
			
		||||
            memcpy(&hash, ((char*)&s) + sizeof(u16_t), sizeof(u64_t));
 | 
			
		||||
            hash ^= *((u16_t*)&s);
 | 
			
		||||
        }
 | 
			
		||||
    } else {
 | 
			
		||||
        if (is_little_endian) {
 | 
			
		||||
            hash  = *((u32_t*)&s) ^ *((u32_t*)&s + 1);
 | 
			
		||||
            hash ^= *((u16_t*)(((u32_t*)&s) + 2));
 | 
			
		||||
        } else {
 | 
			
		||||
            u32_t x;
 | 
			
		||||
 | 
			
		||||
    return x ^ y;
 | 
			
		||||
            memcpy(&hash, ((char*)&s) + sizeof(u16_t), sizeof(u32_t));
 | 
			
		||||
            memcpy(&x, ((char*)&s) + sizeof(u16_t) + sizeof(u32_t), sizeof(u32_t));
 | 
			
		||||
 | 
			
		||||
            hash ^= x;
 | 
			
		||||
            hash ^= *((u16_t*)&s);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return hash;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/*#####################################################################################################################*/
 | 
			
		||||
@ -99,7 +117,7 @@ int libcdsb_vtype_compare_values_eq(const void* s0, const void* s1, vtype t) {
 | 
			
		||||
 | 
			
		||||
/*#####################################################################################################################*/
 | 
			
		||||
 | 
			
		||||
hash_t libcdsb_vtype_hash(void* v, vtype t) {
 | 
			
		||||
hash_t libcdsb_vtype_hash(const void* v, vtype t) {
 | 
			
		||||
 | 
			
		||||
    switch (t) { default: abort();
 | 
			
		||||
 | 
			
		||||
@ -116,7 +134,11 @@ hash_t libcdsb_vtype_hash(void* v, vtype t) {
 | 
			
		||||
 | 
			
		||||
        case VTYPE_POINTER: if (!is_x64) goto x86_ptr;
 | 
			
		||||
        case   VTYPE_INT64:
 | 
			
		||||
        case  VTYPE_UINT64: return (hash_t)(*(u64_t*)v);
 | 
			
		||||
        case  VTYPE_UINT64: if (sizeof(hash_t) == sizeof(u64_t)) {
 | 
			
		||||
                                return (hash_t)(*(u64_t*)v);
 | 
			
		||||
                            } else {
 | 
			
		||||
                                return (hash_t)(*(u32_t*)v) ^ (*((u32_t*)v + 1));
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
        case  VTYPE_STRING: return string_hash(v);
 | 
			
		||||
        case   VTYPE_ARRAY: return array_hash(v);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user