HashName - C++ Builder

C++ Builder 参考手册System::SysutilsHashName


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

头文件:#include <System.SysUtils.hpp>
命名空间: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 版本都是如此)。

相关:


C++ Builder 参考手册System::SysutilsHashName

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容