X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-core%2Ftrunk%2Fsrc%2Fsynfig%2Fguid.cpp;h=e537ba661410cfbd2cfc567e768b4ca88c793c34;hb=9459638ad6797b8139f1e9f0715c96076dbf0890;hp=4598c635dbd983c2ae93b28e7c434b0641f4c590;hpb=392b62fa87099d8576a9da614be431a5046fe595;p=synfig.git diff --git a/synfig-core/trunk/src/synfig/guid.cpp b/synfig-core/trunk/src/synfig/guid.cpp index 4598c63..e537ba6 100644 --- a/synfig-core/trunk/src/synfig/guid.cpp +++ b/synfig-core/trunk/src/synfig/guid.cpp @@ -6,7 +6,7 @@ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** Copyright (c) 2007 Chris Moore +** Copyright (c) 2007, 2008 Chris Moore ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -23,8 +23,6 @@ /* === H E A D E R S ======================================================= */ -#define SUBTRACT_RNG_H - #ifdef USING_PCH # include "pch.h" #else @@ -47,11 +45,7 @@ #ifdef HASH_MAP_H #include HASH_MAP_H -#endif - -#ifdef SUBTRACT_RNG_H -#include SUBTRACT_RNG_H -using namespace __gnu_cxx; +#include FUNCTIONAL_H #endif #ifdef _WIN32 @@ -153,20 +147,31 @@ synfig::GUID synfig::GUID::hasher(const String& str) { #ifdef HASH_MAP_H + /* http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1456.html says: + * + * "Some earlier hash table implementations gave char* special + * treatment: it specialized the default hash function to look + * at character array being pointed to, rather than the pointer + * itself. This proposal removes that special treatment." + * + * Unfortunately, the older implementation doesn't seem to want to + * accept Strings, so we're left with this conditional compilation. + */ +# ifdef FUNCTIONAL_HASH_ON_STRING + HASH_MAP_NAMESPACE::hash string_hash_; + const unsigned int seed(string_hash_(str)); +# else // FUNCTIONAL_HASH_ON_STRING HASH_MAP_NAMESPACE::hash string_hash_; - const unsigned int seed( - string_hash_( - str.c_str() - ) - ); -#else - const unsigned int seed(0x3B642879); - for(int i=0;i>(32-(i%24)))^(seed<<(i%24)) + seed^=(seed*str[i])*i; + seed=(seed>>(32-(i%24)))^(seed<<(i%24)); } -#endif +#endif // HASH_MAP_H GUID_RNG random(seed); GUID ret(0);