This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
std::collate hash() still broken
- From: AWLaFramboise at aol dot com
- To: <libstdc++ at gcc dot gnu dot org>
- Cc: <aaronwl at rm-f dot net>
- Date: Sun, 10 Feb 2002 06:28:32 EST
- Subject: std::collate hash() still broken
hi
i noticed in gcc3.0.3 std::collate hash() was broken, so i checked cvs. the obvious bug had been fixed, but still leaving a more subtle one. its a rotary hash.. it should be doing a full rotate instead of a fonky kindof rotate like it is now. the thing it has right now will not work correctly. try comparing hashes of "xxxx" to "xxxxxxxx" or something.. they're identical.
test program and patch:
#include <iomanip>
#include <iostream>
#include <limits>
#include <locale>
#include <string>
int main() {
std::string str;
std::cout << "String: ";
std::getline(std::cin, str);
const std::collate<char> &col
= std::use_facet<std::collate<char> >(std::locale());
const char *data = str.data();
std::cout << "Hash: 0x" << std::hex
<< col.hash(data, data + str.size()) << '\n';
}
and the patch against current cvs:
diff -c -3 -p -r1.59 locale_facets.tcc
*** gcc+hax0r/libstdc++-v3/include/bits/locale_facets.tcc 6 Feb 2002 12:12:58 -0000 1.59
--- gcc+hax0r/libstdc++-v3/include/bits/locale_facets.tcc 10 Feb 2002 11:10:17 -0000
*************** namespace std
*** 1855,1861 ****
unsigned long __val = 0;
for (; __lo < __hi; ++__lo)
__val = *__lo + ((__val << 7) |
! (__val >> (numeric_limits<unsigned long>::digits - 1)));
return static_cast<long>(__val);
}
--- 1855,1861 ----
unsigned long __val = 0;
for (; __lo < __hi; ++__lo)
__val = *__lo + ((__val << 7) |
! (__val >> (numeric_limits<unsigned long>::digits - 7)));
return static_cast<long>(__val);
}
thanks for your kind attention,
AaronWL