|
clsDictionary.rar
(8.62 KB, 下载次数: 39)
一开始我也是觉得IEnumVARIANT快,应该是参数传递太多再加上操作复杂些的原因。Collection毕竟是C或C++优化过的东西,VBA没法比的。
不知道直接调用C++中hashtable里会快多少。
改掉了个bug,又折腾了好几个hash函数,下面是代码(MurmurHash3是开源的github上有源码),哪个最快我比较不出来,有随机性。不过CaseInsensitive的一定要自己写,Lcase效率低接近1半。
- // @detail 本 算法由于在Brian Kernighan与Dennis Ritchie的《The C Programming Language》一书被展示而得 名,是一种简单快捷的hash算法,也是Java目前采用的字符串的Hash算法(累乘因子为31)。
- size_t __stdcall HashCaseSensitive( const wchar_t* str, long iLen){
- register size_t hash = 0;
- while ((--iLen) >= 0){
- hash = hash * 131 + (*str++);
- }
- return hash;
- }
- size_t __stdcall HashCaseInsensitive(const wchar_t* str, long iLen){
- register size_t hash = 0;
- while ((--iLen) >= 0){
- hash = hash * 131 +( (*str > L'Z' or *str < L'A') ? (*str++) : ((*str++) | 0x20));
- }
- return hash;
- }
- _INLINE_VAR constexpr size_t _FNV_offset_basis = 2166136261U;
- _INLINE_VAR constexpr size_t _FNV_prime = 16777619U;
- size_t __stdcall HashCaseSensitive1(const wchar_t* str, long iLen) {
- size_t hash = _FNV_offset_basis;
- while ((--iLen) >= 0) {
- hash ^= static_cast<size_t>(*str++);
- hash *= _FNV_prime;
- }
- return hash;
- }
- size_t __stdcall HashCaseInsensitive1(const wchar_t* str, long iLen) {
- size_t hash = _FNV_offset_basis;
- while ((--iLen) >= 0) {
- hash ^= static_cast<size_t>(((*str > L'Z' or *str < L'A') ? (*str++) : ((*str++) | 0x20)));
- hash *= _FNV_prime;
- }
- return hash;
- }
- size_t __stdcall HashCaseSensitive2(const wchar_t* str, long iLen) {
- size_t hash = 0;
- MurmurHash3_x86_32(str, iLen * sizeof(wchar_t), 0, &hash);
- return hash;
- }
- size_t __stdcall HashCaseInsensitive2(wchar_t* str, long iLen) {
- size_t hash = 0;
- long n = iLen;
- while ((--iLen) >= 0) {
- if (*str <= L'Z' and *str >= L'A')
- *str |= 0x20;
- ++str;
- }
- MurmurHash3_x86_32(str-n, n * sizeof(wchar_t), 0, &hash);
- return hash;
- }
复制代码
|
评分
-
1
查看全部评分
-
|