Boost logo

Boost :

From: Pavel Vozenilek (pavel_vozenilek_at_[hidden])
Date: 2005-03-09 06:33:43


"Thorsten Ottosen" wrote:

> It's a pleasure to announce that the review of Daniel James'
> hash functions library...
>
Just few comments and questions from quick playing.

/Pavel

______________________________________________
1. Woudn't it be better to have separate
   headers as hash_for_sets.hpp, hash_for_maps.hpp etc
   instead of one header including the whole world?

   This way other Boost containers could be added
   w/o affecting compile time.

   I remember long debates about this during
   Serialization review. These resulted in solution
   with separate headers + common header for all.

   And if possible, other containers (slist,
   few Boost ones) should be added.

   It may be considered whether support for
   shared_ptr etc could be added.

______________________________________________
2. The reference documentation says string
   and wstring are passed by value, while they
   are by const&.

______________________________________________
3. __int64/long long should be supported.

______________________________________________
4. What if I would like hash result other
   than size_t, frex unsigned char?

   I may be memory constrained or may want to save
   data on disk.

______________________________________________
5. namespace detail would be better hash_detail
   to avoid possible clashes.

______________________________________________
6. Maybe the struct hash::operator() could use
   boost::call_traits<T>::param_type to
   optimize value passing for primitive types.

______________________________________________
7. compiling hash_float_test.cpp with Intel C++ 7.0
   plugged in VC6 IDE (with old Dinkumware) I get:

hash_float_test.cpp
C:\work\reviews\hash\hash\libs\functional\hash\test\hash_float_test.cpp(56):
error: identifier "denorm_present" is undefined
          if(std::numeric_limits<T>::has_denorm == denorm_present) {

BCB 6.4 with STLport 4.5.1 says:

[Linker Error] Unresolved external '_STL::_LimG<bool>::_F_inf' referenced
from C:\WORK\REVIEWS\HASH\HASH\LIBS\FUNCTIONAL\HASH\TEST\HASH_FLOAT_TEST.OBJ
[Linker Error] Unresolved external '_STL::_LimG<bool>::_F_qNaN' referenced
from C:\WORK\REVIEWS\HASH\HASH\LIBS\FUNCTIONAL\HASH\TEST\HASH_FLOAT_TEST.OBJ
[Linker Error] Unresolved external '_STL::_LimG<bool>::_D_inf' referenced
from C:\WORK\REVIEWS\HASH\HASH\LIBS\FUNCTIONAL\HASH\TEST\HASH_FLOAT_TEST.OBJ
[Linker Error] Unresolved external '_STL::_LimG<bool>::_D_qNaN' referenced
from C:\WORK\REVIEWS\HASH\HASH\LIBS\FUNCTIONAL\HASH\TEST\HASH_FLOAT_TEST.OBJ
[Linker Error] Unresolved external '_STL::_LimG<bool>::_L_inf' referenced
from C:\WORK\REVIEWS\HASH\HASH\LIBS\FUNCTIONAL\HASH\TEST\HASH_FLOAT_TEST.OBJ
[Linker Error] Unresolved external '_STL::_LimG<bool>::_L_qNaN' referenced
from C:\WORK\REVIEWS\HASH\HASH\LIBS\FUNCTIONAL\HASH\TEST\HASH_FLOAT_TEST.OBJ

______________________________________________
8. old Dinkumware fix: hash_custom_test.cpp:

return hasher(std::tolower(x));

==>>

using namespace std;
return hasher(tolower(x));

______________________________________________
9. Win32 Intel fix: by default I get error:

C:\work\reviews\hash\hash\boost/functional/hash.hpp(226): error:
no instance of overloaded function "boost::hash_value" matches the argument
list
            argument types are: (const test::custom)
              return hash_value(val);

one needs to add compiler option:
    /Qoption,c,--arg_dep_lookup

to enable ADL with Intel when emulating VC6.

______________________________________________
10. performance: wouldn't it be better to provide
    hand written specialization for std::string/wstring
    instead of relying on hash_range/combine?

    The compiler may not optimize chain of functions
    out/pass parameters in most efficient way/
    keep most data in registers.

    It's just feeling, I didn't do any measurements.

______________________________________________
11. VC6 warning: just for completeness

hash_number_test.cpp
c:\boost\boost_1_32_0\boost\test\test_tools.hpp(428) :
warning C4805: '==' : unsafe mix of type 'const int' and type 'const bool'
in operation
        c:\work\reviews\hash\hash\libs\functional\hash\test\hash_number_test.cpp(48)
:
see reference to function template instantiation 'bool __cdecl
boost::test_tools::tt_detail::equal_and_continue_impl(const int &,const bool
&,class boost::basic_w
rap_stringstream<char> &,class boost::unit_test::basic_cstring<char const
>,unsigned int,enum boost::unit_test::log_level,unsigned int)' being
compiled

______________________________________________
12. BCB compiles and runs all tests (w/o floats).
    Intel 7 dtto (with the fix from [9] for custom test).
    VC6 doesn't floats and custom test (due to lack ADL).

______________________________________________
13. The headers may have

#if (defined _MSC_VER) && (_MSC_VER >= 1200)
# pragma once
#endif

on the top.

______________________________________________
14. some rationale may be given for hash function

  seed ^= hash_value(v) + (seed<<6) + (seed>>2);

- link where does it come from or so.

If one creates different algorithm the code
may be prepared for such situation by:

#ifdef BOOST_HASH_USER_HASH_COMBINE_OFFERED
   BOOST_HASH_USER_HASH_COMBINE_OFFERED;
#else
  seed ^= hash_value(v) + (seed<<6) + (seed>>2);
#endif

or something like that.

______________________________________________
15. Complete example how to write e.g. case
    insensitive hash and how to plug it in should
    be shown in docs.

______________________________________________
EOF


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk