X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=include%2Flibfirm%2Fadt%2Fhashptr.h;h=918843e85db0180a91b91315a3a82b1055ae6bed;hb=f7a0dee11313faad6f2ff54edc8eaadabd03e433;hp=043ba5b63c1ed916288988df16099d20a0d50509;hpb=435253f3a8766fec2ac2adf559bb10cfcb5d36f4;p=libfirm diff --git a/include/libfirm/adt/hashptr.h b/include/libfirm/adt/hashptr.h index 043ba5b63..918843e85 100644 --- a/include/libfirm/adt/hashptr.h +++ b/include/libfirm/adt/hashptr.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 1995-2007 University of Karlsruhe. All right reserved. + * Copyright (C) 1995-2008 University of Karlsruhe. All right reserved. * * This file is part of libFirm. * @@ -27,13 +27,13 @@ #define FIRM_ADT_HASHPTR_H #include "firm_config.h" +#include "compiler.h" #define _FIRM_FNV_OFFSET_BASIS 2166136261U #define _FIRM_FNV_FNV_PRIME 16777619U /* Computing x * _FIRM_FNV_FNV_PRIME */ -#define _FIRM_FNV_TIMES_PRIME(x) \ - (((x) << 24) + ((x) << 8) + ((x) << 7) + ((x) << 4) + ((x) << 1) + 1) +#define _FIRM_FNV_TIMES_PRIME(x) ((x) * _FIRM_FNV_FNV_PRIME) static INLINE unsigned firm_fnv_hash(const unsigned char *data, unsigned bytes) { @@ -48,11 +48,24 @@ static INLINE unsigned firm_fnv_hash(const unsigned char *data, unsigned bytes) return hash; } +static INLINE unsigned firm_fnv_hash_str(const char *data) +{ + unsigned i; + unsigned hash = _FIRM_FNV_OFFSET_BASIS; + + for(i = 0; data[i] != '\0'; ++i) { + hash = _FIRM_FNV_TIMES_PRIME(hash); + hash ^= data[i]; + } + + return hash; +} + /** * hash a pointer value: Pointer addresses are mostly aligned to 4 * or 8 bytes. So we remove the lowest 3 bits */ -#define HASH_PTR(ptr) (((char *) (ptr) - (char *)0) >> 3) +#define HASH_PTR(ptr) ((unsigned)(((char *) (ptr) - (char *)0) >> 3)) /** * Hash a string.