Ting_dang 发表于 2011-4-7 15:45:22

谁知道这个是怎么计算出来的?

ExFAT文件系统中,用户目录项的属性2中有个 文件名HASH值(用于查找时快速比较文件名的),有谁知道这个是怎么计算出来的,请告诉我计算公式?

330wang 发表于 2011-4-7 17:07:10

WORD CalcFileNameHash (LPCWSTR filename)
(
   WORD chk = 0;
   int len, i;
   
   len = lstrlenW (filename);
   for (i = 0; i <len; i + +) (
         WCHAR c = (WCHAR) CharUpperW ((LPWSTR) filename );
         chk = (WORD) (((chk <<15) | (chk>> 1)) + LOBYTE (c));
         chk = (WORD) (((chk <<15) | (chk>> 1)) + HIBYTE (c));
   )
   return chk;
)

Ting_dang 发表于 2011-4-7 18:11:21

回复 2# 330wang


    嗯,这个我也在论坛里面找到了,关键是其中的函数lstrlenW和CharUpperW是什么意思?怎么实现的?
   抱歉,我对Windows编程一点都不了解。

Ting_dang 发表于 2011-4-9 16:32:21

只有我自己回答自己了,这几天对照日文原始文档,加上测试研究,总算明白了实现原理:

WORD CalcFileNameHash (LPCWSTR filename)
(
   WORD chk = 0;
   int len, i;
   
   len = lstrlenW (filename);
   for (i = 0; i <len; i + +) (
         WCHAR c = (WCHAR) CharUpperW ((LPWSTR) filename );
         chk = (WORD) (((chk <<15) | (chk>> 1)) + LOBYTE (c));
         chk = (WORD) (((chk <<15) | (chk>> 1)) + HIBYTE (c));
   )
   return chk;
)
lstrlenW 函数返回的是宽字节字符串的字符个数。可以自己写一个,很简单。
CharUpperW函数是将宽字节字符串中能转换为大写字符的转换为大写输出,否则原样输出。具体实现可以参考日文文档中给出的范围规范映射一下即可。

哎,我发现现在到处转抄的太多了,真正涉及到技术细节的帖子太难找到。

绝恋~魅影 发表于 2011-4-9 17:11:42

对我来说像是天书啊

char001 发表于 2011-6-13 18:00:25

对我来说像是天书啊

xuyimin 发表于 2011-7-9 11:31:08

对我来说像是天书啊
看来,要成为高手,还要学习一门外语和一门计算机语言!

sallxy 发表于 2011-7-9 18:19:42

是,全是一堆蜘蛛在爬

佳家 发表于 2011-7-11 13:36:10

看不懂.....

gujifly 发表于 2012-5-6 21:13:03

给出代码,自己调试一下就明白啦。
页: [1] 2
查看完整版本: 谁知道这个是怎么计算出来的?