2 * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved.
4 * This file is part of libFirm.
6 * This file may be distributed and/or modified under the terms of the
7 * GNU General Public License version 2 as published by the Free Software
8 * Foundation and appearing in the file LICENSE.GPL included in the
9 * packaging of this file.
11 * Licensees holding valid libFirm Professional Edition licenses may use
12 * this file in accordance with the libFirm Commercial License.
13 * Agreement provided with the Software.
15 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
16 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * @brief Hash function for pointers
23 * @author Michael Beck, Sebastian Hack
26 #ifndef FIRM_ADT_HASHPTR_H
27 #define FIRM_ADT_HASHPTR_H
31 #define _FIRM_FNV_OFFSET_BASIS 2166136261U
32 #define _FIRM_FNV_FNV_PRIME 16777619U
34 /* Computing x * _FIRM_FNV_FNV_PRIME */
35 #define _FIRM_FNV_TIMES_PRIME(x) ((x) * _FIRM_FNV_FNV_PRIME)
37 static inline unsigned firm_fnv_hash(const unsigned char *data, unsigned bytes)
40 unsigned hash = _FIRM_FNV_OFFSET_BASIS;
42 for(i = 0; i < bytes; ++i) {
43 hash = _FIRM_FNV_TIMES_PRIME(hash);
50 static inline unsigned firm_fnv_hash_str(const char *data)
53 unsigned hash = _FIRM_FNV_OFFSET_BASIS;
55 for(i = 0; data[i] != '\0'; ++i) {
56 hash = _FIRM_FNV_TIMES_PRIME(hash);
64 * hash a pointer value: Pointer addresses are mostly aligned to 4
65 * or 8 bytes. So we remove the lowest 3 bits
67 #define HASH_PTR(ptr) ((unsigned)(((char *) (ptr) - (char *)0) >> 3))
69 static inline unsigned hash_ptr(const void *ptr)
76 * @param str The string (can be const).
77 * @param len The length of the string.
78 * @return A hash value for the string.
80 #define HASH_STR(str,len) firm_fnv_hash((const unsigned char *) (str), (len))
83 #pragma warning(disable:4307)
86 static inline unsigned _hash_combine(unsigned x, unsigned y)
88 unsigned hash = _FIRM_FNV_TIMES_PRIME(_FIRM_FNV_OFFSET_BASIS);
90 hash = _FIRM_FNV_TIMES_PRIME(hash);
96 #pragma warning(default:4307)
100 * Make one hash value out of two others.
101 * @param a One hash value.
102 * @param b Another hash value.
103 * @return A hash value computed from the both.
105 #define HASH_COMBINE(a,b) _hash_combine(a, b)