Changeset 4485

Show
Ignore:
Timestamp:
02/05/07 17:44:17 (2 years ago)
Author:
morris
Message:

Add more hash functions

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libwired/trunk/libwired/base/wi-base.c

    r4437 r4485  
    190190 
    191191wi_hash_code_t wi_hash_pointer(const void *p) { 
    192 #if defined(__x86_64__) || defined(__ppc64__) || defined(__sparc64__) 
     192#ifdef __LP64__ 
    193193        return (wi_hash_code_t) ((((uint64_t) p) >> 32) ^ ((uint64_t) p)); 
    194194#else 
     
    212212    return (wi_hash_code_t) fmod(i, (double) 0xFFFFFFFF) + ((d - i) * 0xFFFFFFFF); 
    213213} 
     214 
     215 
     216 
     217#define _WI_ELF_STEP(byte, hash)                                                                \ 
     218        WI_STMT_START                                                                                           \ 
     219                (hash) = ((hash) << 4) + (byte);                                                \ 
     220                (hash) ^= ((hash) >> 24) & 0xF0;                                                \ 
     221        WI_STMT_END 
     222 
     223 
     224 
     225wi_hash_code_t wi_hash_data(unsigned char *bytes, wi_uinteger_t length) { 
     226        wi_hash_code_t  hash = 0; 
     227        wi_uinteger_t   i; 
     228         
     229        i = length; 
     230         
     231        while(i > 3) { 
     232        _WI_ELF_STEP(bytes[length - i    ], hash); 
     233        _WI_ELF_STEP(bytes[length - i + 1], hash); 
     234        _WI_ELF_STEP(bytes[length - i + 2], hash); 
     235        _WI_ELF_STEP(bytes[length - i + 3], hash); 
     236        i -= 4; 
     237        } 
     238 
     239    switch (i) { 
     240                case 3: _WI_ELF_STEP(bytes[length - 3], hash); 
     241                case 2: _WI_ELF_STEP(bytes[length - 2], hash); 
     242                case 1: _WI_ELF_STEP(bytes[length - 1], hash); 
     243    } 
     244         
     245        return hash; 
     246} 
  • libwired/trunk/libwired/base/wi-runtime.h

    r4437 r4485  
    4343typedef wi_runtime_instance_t *                 wi_copy_func_t(wi_runtime_instance_t *); 
    4444typedef wi_boolean_t                                    wi_is_equal_func_t(wi_runtime_instance_t *, wi_runtime_instance_t *); 
     45typedef wi_string_t *                                   wi_description_func_t(wi_runtime_instance_t *); 
    4546typedef wi_hash_code_t                                  wi_hash_func_t(wi_runtime_instance_t *); 
    46 typedef wi_string_t *                                   wi_description_func_t(wi_runtime_instance_t *); 
    4747 
    4848typedef wi_runtime_instance_t *                 wi_retain_func_t(wi_runtime_instance_t *); 
  • libwired/trunk/libwired/collections/wi-array.c

    r4437 r4485  
    112112static wi_boolean_t                                             _wi_array_is_equal(wi_runtime_instance_t *, wi_runtime_instance_t *); 
    113113static wi_string_t *                                    _wi_array_description(wi_runtime_instance_t *); 
     114static wi_hash_code_t                                   _wi_array_hash(wi_runtime_instance_t *); 
    114115 
    115116static void                                                             _wi_array_grow(wi_array_t *, wi_uinteger_t); 
     
    149150        _wi_array_is_equal, 
    150151        _wi_array_description, 
    151         NULL 
     152        _wi_array_hash 
    152153}; 
    153154 
     
    435436 
    436437 
     438static wi_hash_code_t _wi_array_hash(wi_runtime_instance_t *instance) { 
     439        wi_array_t              *array = instance; 
     440 
     441        return array->data_count; 
     442} 
     443 
     444 
     445 
    437446#pragma mark - 
    438447 
  • libwired/trunk/libwired/collections/wi-hash.c

    r4437 r4485  
    138138static wi_boolean_t                                             _wi_hash_is_equal(wi_runtime_instance_t *, wi_runtime_instance_t *); 
    139139static wi_string_t *                                    _wi_hash_description(wi_runtime_instance_t *); 
     140static wi_hash_code_t                                   _wi_hash_hash(wi_runtime_instance_t *); 
    140141 
    141142static _wi_hash_bucket_t *                              _wi_enumerator_hash_enumerator(wi_runtime_instance_t *, void *); 
     
    182183        _wi_hash_is_equal, 
    183184        _wi_hash_description, 
    184         NULL 
     185        _wi_hash_hash 
    185186}; 
    186187 
     
    356357} 
    357358 
     359 
     360 
     361static wi_hash_code_t _wi_hash_hash(wi_runtime_instance_t *instance) { 
     362        wi_hash_t               *hash = instance; 
     363         
     364        return hash->key_count; 
     365} 
    358366 
    359367 
  • libwired/trunk/libwired/collections/wi-set.c

    r4473 r4485  
    120120static wi_boolean_t                                             _wi_set_is_equal(wi_runtime_instance_t *, wi_runtime_instance_t *); 
    121121static wi_string_t *                                    _wi_set_description(wi_runtime_instance_t *); 
     122static wi_hash_code_t                                   _wi_set_hash(wi_runtime_instance_t *); 
    122123 
    123124static void                                                             _wi_set_resize(wi_set_t *); 
     
    145146        _wi_set_is_equal, 
    146147        _wi_set_description, 
    147         NULL 
     148        _wi_set_hash 
    148149}; 
    149150 
     
    313314} 
    314315 
     316 
     317 
     318static wi_hash_code_t _wi_set_hash(wi_runtime_instance_t *instance) { 
     319        wi_set_t        *set = instance; 
     320         
     321        return set->data_count; 
     322} 
    315323 
    316324 
  • libwired/trunk/libwired/data/wi-data.c

    r4437 r4485  
    5656static wi_runtime_instance_t *                  _wi_data_copy(wi_runtime_instance_t *); 
    5757static wi_boolean_t                                             _wi_data_is_equal(wi_runtime_instance_t *, wi_runtime_instance_t *); 
     58static wi_string_t *                                    _wi_data_description(wi_runtime_instance_t *); 
    5859static wi_hash_code_t                                   _wi_data_hash(wi_runtime_instance_t *); 
    59 static wi_string_t *                                    _wi_data_description(wi_runtime_instance_t *); 
    6060 
    6161 
     
    245245 
    246246 
    247 static wi_hash_code_t _wi_data_hash(wi_runtime_instance_t *instance) { 
    248         wi_data_t               *data = instance; 
    249          
    250         return wi_hash_pointer(data); 
    251 } 
    252  
    253  
    254  
    255247static wi_string_t * _wi_data_description(wi_runtime_instance_t *instance) { 
    256248        wi_data_t                       *data = instance; 
     
    270262         
    271263        return description; 
     264} 
     265 
     266 
     267 
     268static wi_hash_code_t _wi_data_hash(wi_runtime_instance_t *instance) { 
     269        wi_data_t               *data = instance; 
     270         
     271        return wi_hash_data(data->bytes, data->length); 
    272272} 
    273273 
  • libwired/trunk/libwired/data/wi-uuid.c

    r4437 r4485  
    353353 
    354354 
    355 static wi_hash_code_t _wi_uuid_hash(wi_runtime_instance_t *instance) { 
    356         wi_uuid_t               *uuid = instance; 
    357          
    358         return wi_hash(_wi_uuid_string(uuid)); 
    359 } 
    360  
    361  
    362  
    363355static wi_string_t * _wi_uuid_description(wi_runtime_instance_t *instance) { 
    364356        wi_uuid_t               *uuid = instance; 
     
    368360                uuid, 
    369361                _wi_uuid_string(uuid)); 
     362} 
     363 
     364 
     365 
     366static wi_hash_code_t _wi_uuid_hash(wi_runtime_instance_t *instance) { 
     367        wi_uuid_t               *uuid = instance; 
     368         
     369        return wi_hash(_wi_uuid_string(uuid)); 
    370370} 
    371371 
  • libwired/trunk/libwired/net/wi-address.c

    r4437 r4485  
    8585 
    8686static wi_runtime_instance_t *                  _wi_address_copy(wi_runtime_instance_t *); 
     87static wi_boolean_t                                             _wi_address_is_equal(wi_runtime_instance_t *, wi_runtime_instance_t *); 
    8788static wi_string_t *                                    _wi_address_description(wi_runtime_instance_t *); 
    88 static wi_boolean_t                                            _wi_address_is_equal(wi_runtime_instance_t *, wi_runtime_instance_t *); 
     89static wi_hash_code_t                                  _wi_address_hash(wi_runtime_instance_t *); 
    8990 
    9091 
     
    9697        _wi_address_is_equal, 
    9798        _wi_address_description, 
    98         NULL 
     99        _wi_address_hash 
    99100}; 
    100101 
     
    187188 
    188189 
     190static wi_boolean_t _wi_address_is_equal(wi_runtime_instance_t *instance1, wi_runtime_instance_t *instance2) { 
     191        wi_address_t            *address1 = instance1; 
     192        wi_address_t            *address2 = instance2; 
     193         
     194        return wi_is_equal(wi_address_string(address1), wi_address_string(address2)); 
     195} 
     196 
     197 
     198 
    189199static wi_string_t * _wi_address_description(wi_runtime_instance_t *instance) { 
    190200        wi_address_t                    *address = instance; 
     
    216226 
    217227 
    218 static wi_boolean_t _wi_address_is_equal(wi_runtime_instance_t *instance1, wi_runtime_instance_t *instance2) { 
    219         wi_address_t            *address1 = instance1; 
    220         wi_address_t            *address2 = instance2; 
    221          
    222         return wi_is_equal(wi_address_string(address1), wi_address_string(address2)); 
     228static wi_hash_code_t _wi_address_hash(wi_runtime_instance_t *instance) { 
     229        wi_address_t            *address = instance; 
     230         
     231        return wi_hash(wi_address_string(address)); 
    223232} 
    224233 
  • libwired/trunk/libwired/net/wi-host.c

    r4437 r4485  
    6565static wi_boolean_t                                             _wi_host_is_equal(wi_runtime_instance_t *, wi_runtime_instance_t *); 
    6666static wi_string_t *                                    _wi_host_description(wi_runtime_instance_t *); 
     67static wi_hash_code_t                                   _wi_host_hash(wi_runtime_instance_t *); 
    6768 
    6869static wi_array_t *                                             _wi_host_all_interface_addresses(void); 
     
    7778        _wi_host_is_equal, 
    7879        _wi_host_description, 
    79         NULL 
     80        _wi_host_hash 
    8081}; 
    8182 
     
    199200 
    200201 
     202static wi_hash_code_t _wi_host_hash(wi_runtime_instance_t *instance) { 
     203        wi_host_t               *host = instance; 
     204         
     205        return wi_hash(wi_host_addresses(host)); 
     206} 
     207 
     208 
     209 
    201210#pragma mark - 
    202211 
  • libwired/trunk/libwired/private/wi-private.h

    r4437 r4485  
    106106WI_EXPORT wi_hash_code_t                wi_hash_int(int); 
    107107WI_EXPORT wi_hash_code_t                wi_hash_double(double); 
     108WI_EXPORT wi_hash_code_t                wi_hash_data(unsigned char *, wi_uinteger_t); 
    108109 
    109110