C++ Builder 參考手冊(cè) ? System::Sysutils ? HashName
計(jì)算一個(gè)字符串的 Hash 值俄烁,大小寫的 Hash 值相同
頭文件:#include <System.SysUtils.hpp>
命名空間:System::Sysutils
函數(shù)原型:
unsigned __fastcall HashName(char *Name);
參數(shù):
- Name:字符串,UTF-8 編碼;
返回值:
- 字符串 Name 的 Hash 值,Name 不區(qū)分大小寫 (大小寫得到的結(jié)果相同)虑绵;
- 這個(gè)函數(shù)在 System::Sysutils 里面內(nèi)部使用喳瓣,只是一個(gè)簡(jiǎn)單的判斷,應(yīng)用程序里面不建議使用恩敌。
以下為根據(jù)源碼分析的結(jié)果:
- Name 只包含英文字母及數(shù)字 (所有 UNICODE 編碼值 1~127 的字符)疾忍,先把字符串轉(zhuǎn)成小寫乔外,再計(jì)算;
例如計(jì)算 "Hsuanlu" 先轉(zhuǎn)成小寫 "hsuanlu" 再計(jì)算一罩;計(jì)算之前先把 Hash 值清零杨幼,以后每個(gè)字符:字符編碼值與 Hash 取異或,把得到的這個(gè)值的高5位于低27位交換位置作為 Hash 值擒抛,再計(jì)算下一個(gè)字符推汽; - Name 里面包含漢字 (任何 UNICODE 編碼值 ≥ 128 的字符)补疑,之前的字符丟棄歧沪,從第一個(gè)這樣的字符開始,先轉(zhuǎn)成大寫再計(jì)算莲组,例如 "Huanlu玄坴abc" 是計(jì)算的轉(zhuǎn)為大寫的 "玄坴ABC"诊胞,前面的 "Huanlu" 被丟棄;計(jì)算之前把 Hash 值清零锹杈,把 Name 轉(zhuǎn)為 UTF-16 編碼撵孤,每個(gè) char16_t 字符:先把 Hash 值的高5位和低27位交換位置,再與這個(gè) char16_t 值取異或竭望,這個(gè)結(jié)果作為 Hash 值邪码,再計(jì)算下一個(gè)字符;
- 注意:
? 前面兩種情況的計(jì)算順序:先異或還是先高低位交換是不同的咬清;
? 第二種情況存在缺陷 (或者說是 bug)闭专,即包含編碼值為 128 開始的字符 (例如漢字) 時(shí)的情況奴潘,會(huì)丟棄第一個(gè)漢字之前的字符沒有被計(jì)算 (一直到目前的 11.0 Alexandria 版本都是如此)。
相關(guān):
- System::TObject::GetHashCode
- System::TObject::ClassName
- System::TObject::ClassType
- System::TObject::ClassParent
- System::TObject::FieldAddress
- System::TObject::MethodAddress
- System::TObject::MethodName
- System::TObject::InheritsFrom
- System::TObject
- System
C++ Builder 參考手冊(cè) ? System::Sysutils ? HashName