HashName - C++ Builder

C++ Builder 参考手册 ➙ System::Sysutils ➙ HashName


计算一个字符串的 Hash 值,大小写的 Hash 值相同

头文件:#include
命名空间:System::Sysutils
函数原型:

unsigned __fastcall HashName(char *Name);

参数:

  • Name:字符串,UTF-8 编码;

返回值:

  • 字符串 Name 的 Hash 值,Name 不区分大小写 (大小写得到的结果相同);
  • 这个函数在 System::Sysutils 里面内部使用,只是一个简单的判断,应用程序里面不建议使用。

以下为根据源码分析的结果:

  • Name 只包含英文字母及数字 (所有 UNICODE 编码值 1~127 的字符),先把字符串转成小写,再计算;
    例如计算 "Hsuanlu" 先转成小写 "hsuanlu" 再计算;计算之前先把 Hash 值清零,以后每个字符:字符编码值与 Hash 取异或,把得到的这个值的高5位于低27位交换位置作为 Hash 值,再计算下一个字符;
  • Name 里面包含汉字 (任何 UNICODE 编码值 ≥ 128 的字符),之前的字符丢弃,从第一个这样的字符开始,先转成大写再计算,例如 "Huanlu玄坴abc" 是计算的转为大写的 "玄坴ABC",前面的 "Huanlu" 被丢弃;计算之前把 Hash 值清零,把 Name 转为 UTF-16 编码,每个 char16_t 字符:先把 Hash 值的高5位和低27位交换位置,再与这个 char16_t 值取异或,这个结果作为 Hash 值,再计算下一个字符;
  • 注意:
    • 前面两种情况的计算顺序:先异或还是先高低位交换是不同的;
    • 第二种情况存在缺陷 (或者说是 bug),即包含编码值为 128 开始的字符 (例如汉字) 时的情况,会丢弃第一个汉字之前的字符没有被计算 (一直到目前的 11.0 Alexandria 版本都是如此)。

相关:

  • 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 参考手册 ➙ System::Sysutils ➙ HashName

你可能感兴趣的:(HashName - C++ Builder)