/src/opensips/hash_func.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (C) 2001-2003 FhG Fokus |
3 | | * |
4 | | * This file is part of opensips, a free SIP server. |
5 | | * |
6 | | * opensips is free software; you can redistribute it and/or modify |
7 | | * it under the terms of the GNU General Public License as published by |
8 | | * the Free Software Foundation; either version 2 of the License, or |
9 | | * (at your option) any later version |
10 | | * |
11 | | * opensips is distributed in the hope that it will be useful, |
12 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
14 | | * GNU General Public License for more details. |
15 | | * |
16 | | * You should have received a copy of the GNU General Public License |
17 | | * along with this program; if not, write to the Free Software |
18 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | | * |
20 | | * History: |
21 | | *--------- |
22 | | * |
23 | | * 2006-01-20 - new_hash1() added; support for configurable hash size |
24 | | * added (bogdan) |
25 | | * 2006-03-13 - new_hash1() and new_hash2() merged into core_hash(); |
26 | | * added core_case_hash() for case insensitive hashes; |
27 | | * all TM dependet stuff moved to TM config file (bogdan) |
28 | | */ |
29 | | |
30 | | /*! |
31 | | * \file |
32 | | * \brief Hash functions |
33 | | */ |
34 | | |
35 | | |
36 | | #ifndef _HASH_FUNC_H_ |
37 | | #define _HASH_FUNC_H_ |
38 | | |
39 | | #include "str.h" |
40 | | |
41 | | |
42 | 0 | #define ch_h_inc h+=v^(v>>3) |
43 | | #define ch_icase(_c) (((_c)>='A'&&(_c)<='Z')?((_c)|0x20):(_c)) |
44 | | |
45 | | /* NOTE: @size must be 2^N, otherwise there will be gaps in the output range */ |
46 | | static inline unsigned int core_hash(const str *s1, const str *s2, const unsigned int size) |
47 | 0 | { |
48 | 0 | char *p, *end; |
49 | 0 | register unsigned v; |
50 | 0 | register unsigned h; |
51 | |
|
52 | 0 | h=0; |
53 | |
|
54 | 0 | end=s1->s+s1->len; |
55 | 0 | for ( p=s1->s ; p<=(end-4) ; p+=4 ){ |
56 | 0 | v=(*p<<24)+(p[1]<<16)+(p[2]<<8)+p[3]; |
57 | 0 | ch_h_inc; |
58 | 0 | } |
59 | 0 | v=0; |
60 | 0 | for (; p<end ; p++){ v<<=8; v+=*p;} |
61 | 0 | ch_h_inc; |
62 | |
|
63 | 0 | if (s2) { |
64 | 0 | end=s2->s+s2->len; |
65 | 0 | for (p=s2->s; p<=(end-4); p+=4){ |
66 | 0 | v=(*p<<24)+(p[1]<<16)+(p[2]<<8)+p[3]; |
67 | 0 | ch_h_inc; |
68 | 0 | } |
69 | 0 | v=0; |
70 | 0 | for (; p<end ; p++){ v<<=8; v+=*p;} |
71 | 0 | ch_h_inc; |
72 | 0 | } |
73 | 0 | h=((h)+(h>>11))+((h>>13)+(h>>23)); |
74 | 0 | return size?((h)&(size-1)):h; |
75 | 0 | } Unexecuted instantiation: fuzz_csv_parser.c:core_hash Unexecuted instantiation: csv.c:core_hash Unexecuted instantiation: dprint.c:core_hash Unexecuted instantiation: pt.c:core_hash Unexecuted instantiation: ut.c:core_hash Unexecuted instantiation: statistics.c:core_hash Unexecuted instantiation: route.c:core_hash Unexecuted instantiation: ipc.c:core_hash Unexecuted instantiation: core_stats.c:core_hash Unexecuted instantiation: route_struct.c:core_hash Unexecuted instantiation: dset.c:core_hash Unexecuted instantiation: pt_load.c:core_hash Unexecuted instantiation: sr_module.c:core_hash Unexecuted instantiation: action.c:core_hash Unexecuted instantiation: db_insertq.c:core_hash Unexecuted instantiation: db.c:core_hash Unexecuted instantiation: proto_tcp.c:core_hash Unexecuted instantiation: proto_udp.c:core_hash Unexecuted instantiation: net_tcp_proc.c:core_hash Unexecuted instantiation: net_tcp.c:core_hash Unexecuted instantiation: tcp_common.c:core_hash Unexecuted instantiation: net_udp.c:core_hash Unexecuted instantiation: tcp_conn_profile.c:core_hash Unexecuted instantiation: trans_trace.c:core_hash Unexecuted instantiation: net_tcp_report.c:core_hash Unexecuted instantiation: shm_mem.c:core_hash Unexecuted instantiation: f_parallel_malloc.c:core_hash Unexecuted instantiation: q_malloc.c:core_hash Unexecuted instantiation: rpm_mem.c:core_hash Unexecuted instantiation: mem.c:core_hash Unexecuted instantiation: mi.c:core_hash Unexecuted instantiation: item.c:core_hash Unexecuted instantiation: msg_parser.c:core_hash Unexecuted instantiation: parse_uri.c:core_hash Unexecuted instantiation: parse_fline.c:core_hash Unexecuted instantiation: parse_methods.c:core_hash Unexecuted instantiation: parse_hname2.c:core_hash Unexecuted instantiation: parse_content.c:core_hash Unexecuted instantiation: hf.c:core_hash Unexecuted instantiation: parse_to.c:core_hash Unexecuted instantiation: parse_via.c:core_hash Unexecuted instantiation: event_interface.c:core_hash Unexecuted instantiation: evi_params.c:core_hash Unexecuted instantiation: receive.c:core_hash Unexecuted instantiation: ip_addr.c:core_hash Unexecuted instantiation: async.c:core_hash Unexecuted instantiation: daemonize.c:core_hash Unexecuted instantiation: timer.c:core_hash Unexecuted instantiation: trace_api.c:core_hash Unexecuted instantiation: mod_fix.c:core_hash Unexecuted instantiation: reactor.c:core_hash Unexecuted instantiation: strcommon.c:core_hash Unexecuted instantiation: forward.c:core_hash Unexecuted instantiation: xlog.c:core_hash Unexecuted instantiation: blacklists.c:core_hash Unexecuted instantiation: usr_avp.c:core_hash Unexecuted instantiation: sdp_ops.c:core_hash Unexecuted instantiation: resolve.c:core_hash Unexecuted instantiation: io_wait.c:core_hash Unexecuted instantiation: transformations.c:core_hash Unexecuted instantiation: pvar.c:core_hash Unexecuted instantiation: sr_module_deps.c:core_hash Unexecuted instantiation: cfg_reload.c:core_hash Unexecuted instantiation: socket_info.c:core_hash Unexecuted instantiation: time_rec.c:core_hash Unexecuted instantiation: map.c:core_hash Unexecuted instantiation: status_report.c:core_hash Unexecuted instantiation: pt_scaling.c:core_hash Unexecuted instantiation: signals.c:core_hash Unexecuted instantiation: flags.c:core_hash Unexecuted instantiation: db_id.c:core_hash Unexecuted instantiation: trans.c:core_hash Unexecuted instantiation: cJSON.c:core_hash Unexecuted instantiation: sdp.c:core_hash Unexecuted instantiation: sdp_helpr_funcs.c:core_hash Unexecuted instantiation: digest_parser.c:core_hash Unexecuted instantiation: param_parser.c:core_hash Unexecuted instantiation: parse_contact.c:core_hash Unexecuted instantiation: parse_body.c:core_hash Unexecuted instantiation: parse_security.c:core_hash Unexecuted instantiation: parse_call_info.c:core_hash Unexecuted instantiation: parse_event.c:core_hash Unexecuted instantiation: parse_disposition.c:core_hash Unexecuted instantiation: parse_authenticate.c:core_hash Unexecuted instantiation: parser_f.c:core_hash Unexecuted instantiation: parse_rpid.c:core_hash Unexecuted instantiation: parse_ppi.c:core_hash Unexecuted instantiation: parse_fcaps.c:core_hash Unexecuted instantiation: parse_rr.c:core_hash Unexecuted instantiation: parse_param.c:core_hash Unexecuted instantiation: parse_diversion.c:core_hash Unexecuted instantiation: parse_nameaddr.c:core_hash Unexecuted instantiation: parse_expires.c:core_hash Unexecuted instantiation: parse_refer_to.c:core_hash Unexecuted instantiation: parse_from.c:core_hash Unexecuted instantiation: parse_pai.c:core_hash Unexecuted instantiation: evi_transport.c:core_hash Unexecuted instantiation: msg_translator.c:core_hash Unexecuted instantiation: md5utils.c:core_hash Unexecuted instantiation: cfg.tab.c:core_hash Unexecuted instantiation: modparam.c:core_hash Unexecuted instantiation: crc.c:core_hash Unexecuted instantiation: lex.yy.c:core_hash Unexecuted instantiation: cfg_pp.c:core_hash Unexecuted instantiation: proxy.c:core_hash Unexecuted instantiation: shutdown.c:core_hash Unexecuted instantiation: core_cmds.c:core_hash Unexecuted instantiation: cachedb.c:core_hash Unexecuted instantiation: cachedb_id.c:core_hash |
76 | | |
77 | | |
78 | | static inline unsigned int core_case_hash( str *s1, str *s2, unsigned int size) |
79 | 0 | { |
80 | 0 | char *p, *end; |
81 | 0 | register unsigned v; |
82 | 0 | register unsigned h; |
83 | 0 |
|
84 | 0 | h=0; |
85 | 0 |
|
86 | 0 | end=s1->s+s1->len; |
87 | 0 | for ( p=s1->s ; p<=(end-4) ; p+=4 ){ |
88 | 0 | v=(ch_icase(*p)<<24)+(ch_icase(p[1])<<16)+(ch_icase(p[2])<<8) |
89 | 0 | + ch_icase(p[3]); |
90 | 0 | ch_h_inc; |
91 | 0 | } |
92 | 0 | v=0; |
93 | 0 | for (; p<end ; p++){ v<<=8; v+=ch_icase(*p);} |
94 | 0 | ch_h_inc; |
95 | 0 |
|
96 | 0 | if (s2) { |
97 | 0 | end=s2->s+s2->len; |
98 | 0 | for (p=s2->s; p<=(end-4); p+=4){ |
99 | 0 | v=(ch_icase(*p)<<24)+(ch_icase(p[1])<<16)+(ch_icase(p[2])<<8) |
100 | 0 | + ch_icase(p[3]); |
101 | 0 | ch_h_inc; |
102 | 0 | } |
103 | 0 | v=0; |
104 | 0 | for (; p<end ; p++){ v<<=8; v+=ch_icase(*p);} |
105 | 0 | ch_h_inc; |
106 | 0 | } |
107 | 0 | h=((h)+(h>>11))+((h>>13)+(h>>23)); |
108 | 0 | return size?((h)&(size-1)):h; |
109 | 0 | } Unexecuted instantiation: fuzz_csv_parser.c:core_case_hash Unexecuted instantiation: csv.c:core_case_hash Unexecuted instantiation: dprint.c:core_case_hash Unexecuted instantiation: pt.c:core_case_hash Unexecuted instantiation: ut.c:core_case_hash Unexecuted instantiation: statistics.c:core_case_hash Unexecuted instantiation: route.c:core_case_hash Unexecuted instantiation: ipc.c:core_case_hash Unexecuted instantiation: core_stats.c:core_case_hash Unexecuted instantiation: route_struct.c:core_case_hash Unexecuted instantiation: dset.c:core_case_hash Unexecuted instantiation: pt_load.c:core_case_hash Unexecuted instantiation: sr_module.c:core_case_hash Unexecuted instantiation: action.c:core_case_hash Unexecuted instantiation: db_insertq.c:core_case_hash Unexecuted instantiation: db.c:core_case_hash Unexecuted instantiation: proto_tcp.c:core_case_hash Unexecuted instantiation: proto_udp.c:core_case_hash Unexecuted instantiation: net_tcp_proc.c:core_case_hash Unexecuted instantiation: net_tcp.c:core_case_hash Unexecuted instantiation: tcp_common.c:core_case_hash Unexecuted instantiation: net_udp.c:core_case_hash Unexecuted instantiation: tcp_conn_profile.c:core_case_hash Unexecuted instantiation: trans_trace.c:core_case_hash Unexecuted instantiation: net_tcp_report.c:core_case_hash Unexecuted instantiation: shm_mem.c:core_case_hash Unexecuted instantiation: f_parallel_malloc.c:core_case_hash Unexecuted instantiation: q_malloc.c:core_case_hash Unexecuted instantiation: rpm_mem.c:core_case_hash Unexecuted instantiation: mem.c:core_case_hash Unexecuted instantiation: mi.c:core_case_hash Unexecuted instantiation: item.c:core_case_hash Unexecuted instantiation: msg_parser.c:core_case_hash Unexecuted instantiation: parse_uri.c:core_case_hash Unexecuted instantiation: parse_fline.c:core_case_hash Unexecuted instantiation: parse_methods.c:core_case_hash Unexecuted instantiation: parse_hname2.c:core_case_hash Unexecuted instantiation: parse_content.c:core_case_hash Unexecuted instantiation: hf.c:core_case_hash Unexecuted instantiation: parse_to.c:core_case_hash Unexecuted instantiation: parse_via.c:core_case_hash Unexecuted instantiation: event_interface.c:core_case_hash Unexecuted instantiation: evi_params.c:core_case_hash Unexecuted instantiation: receive.c:core_case_hash Unexecuted instantiation: ip_addr.c:core_case_hash Unexecuted instantiation: async.c:core_case_hash Unexecuted instantiation: daemonize.c:core_case_hash Unexecuted instantiation: timer.c:core_case_hash Unexecuted instantiation: trace_api.c:core_case_hash Unexecuted instantiation: mod_fix.c:core_case_hash Unexecuted instantiation: reactor.c:core_case_hash Unexecuted instantiation: strcommon.c:core_case_hash Unexecuted instantiation: forward.c:core_case_hash Unexecuted instantiation: xlog.c:core_case_hash Unexecuted instantiation: blacklists.c:core_case_hash Unexecuted instantiation: usr_avp.c:core_case_hash Unexecuted instantiation: sdp_ops.c:core_case_hash Unexecuted instantiation: resolve.c:core_case_hash Unexecuted instantiation: io_wait.c:core_case_hash Unexecuted instantiation: transformations.c:core_case_hash Unexecuted instantiation: pvar.c:core_case_hash Unexecuted instantiation: sr_module_deps.c:core_case_hash Unexecuted instantiation: cfg_reload.c:core_case_hash Unexecuted instantiation: socket_info.c:core_case_hash Unexecuted instantiation: time_rec.c:core_case_hash Unexecuted instantiation: map.c:core_case_hash Unexecuted instantiation: status_report.c:core_case_hash Unexecuted instantiation: pt_scaling.c:core_case_hash Unexecuted instantiation: signals.c:core_case_hash Unexecuted instantiation: flags.c:core_case_hash Unexecuted instantiation: db_id.c:core_case_hash Unexecuted instantiation: trans.c:core_case_hash Unexecuted instantiation: cJSON.c:core_case_hash Unexecuted instantiation: sdp.c:core_case_hash Unexecuted instantiation: sdp_helpr_funcs.c:core_case_hash Unexecuted instantiation: digest_parser.c:core_case_hash Unexecuted instantiation: param_parser.c:core_case_hash Unexecuted instantiation: parse_contact.c:core_case_hash Unexecuted instantiation: parse_body.c:core_case_hash Unexecuted instantiation: parse_security.c:core_case_hash Unexecuted instantiation: parse_call_info.c:core_case_hash Unexecuted instantiation: parse_event.c:core_case_hash Unexecuted instantiation: parse_disposition.c:core_case_hash Unexecuted instantiation: parse_authenticate.c:core_case_hash Unexecuted instantiation: parser_f.c:core_case_hash Unexecuted instantiation: parse_rpid.c:core_case_hash Unexecuted instantiation: parse_ppi.c:core_case_hash Unexecuted instantiation: parse_fcaps.c:core_case_hash Unexecuted instantiation: parse_rr.c:core_case_hash Unexecuted instantiation: parse_param.c:core_case_hash Unexecuted instantiation: parse_diversion.c:core_case_hash Unexecuted instantiation: parse_nameaddr.c:core_case_hash Unexecuted instantiation: parse_expires.c:core_case_hash Unexecuted instantiation: parse_refer_to.c:core_case_hash Unexecuted instantiation: parse_from.c:core_case_hash Unexecuted instantiation: parse_pai.c:core_case_hash Unexecuted instantiation: evi_transport.c:core_case_hash Unexecuted instantiation: msg_translator.c:core_case_hash Unexecuted instantiation: md5utils.c:core_case_hash Unexecuted instantiation: cfg.tab.c:core_case_hash Unexecuted instantiation: modparam.c:core_case_hash Unexecuted instantiation: crc.c:core_case_hash Unexecuted instantiation: lex.yy.c:core_case_hash Unexecuted instantiation: cfg_pp.c:core_case_hash Unexecuted instantiation: proxy.c:core_case_hash Unexecuted instantiation: shutdown.c:core_case_hash Unexecuted instantiation: core_cmds.c:core_case_hash Unexecuted instantiation: cachedb.c:core_case_hash Unexecuted instantiation: cachedb_id.c:core_case_hash |
110 | | |
111 | | |
112 | | #endif |