[求助] 谁知道这个是怎么计算出来的?

[复制链接]

该用户从未签到

9

主题

39

回帖

1403

积分

[INTOHARD]营长

Rank: 6Rank: 6

积分
1403
发表于 2011-4-7 15:45:22 | 显示全部楼层 |阅读模式
30金子
ExFAT文件系统中,用户目录项的属性2中有个 文件名HASH值(用于查找时快速比较文件名的),有谁知道这个是怎么计算出来的,请告诉我计算公式?

  • TA的每日心情
    开心
    2014-10-29 09:53
  • 签到天数: 226 天

    [LV.7]四品道员

    93

    主题

    1312

    回帖

    2万

    积分

    Intohard Team

    Rank: 7Rank: 7Rank: 7

    积分
    22415
    QQ
    发表于 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;
    )
    回复

    使用道具 举报

    该用户从未签到

    9

    主题

    39

    回帖

    1403

    积分

    [INTOHARD]营长

    Rank: 6Rank: 6

    积分
    1403
     楼主| 发表于 2011-4-7 18:11:21 | 显示全部楼层
    回复 2# 330wang


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

    使用道具 举报

    该用户从未签到

    9

    主题

    39

    回帖

    1403

    积分

    [INTOHARD]营长

    Rank: 6Rank: 6

    积分
    1403
     楼主| 发表于 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函数是将宽字节字符串中能转换为大写字符的转换为大写输出,否则原样输出。具体实现可以参考日文文档中给出的范围规范映射一下即可。

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

    使用道具 举报

    该用户从未签到

    5

    主题

    549

    回帖

    6650

    积分

    [INTOHARD]团长

    论坛之星

    Rank: 8Rank: 8

    积分
    6650
    QQ
    发表于 2011-4-9 17:11:42 | 显示全部楼层
    对我来说像是天书啊
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-3-6 09:10
  • 签到天数: 4 天

    [LV.2]九品芝麻官

    0

    主题

    27

    回帖

    87

    积分

    [INTOHARD]班长

    Rank: 2

    积分
    87
    发表于 2011-6-13 18:00:25 | 显示全部楼层
    对我来说像是天书啊
    回复

    使用道具 举报

  • TA的每日心情
    难过
    2013-3-9 14:12
  • 签到天数: 1 天

    [LV.1]布衣百姓

    2

    主题

    250

    回帖

    364

    积分

    [INTOHARD]排长

    Rank: 3Rank: 3

    积分
    364
    发表于 2011-7-9 11:31:08 | 显示全部楼层
    对我来说像是天书啊
    看来,要成为高手,还要学习一门外语和一门计算机语言!
    回复

    使用道具 举报

    该用户从未签到

    13

    主题

    182

    回帖

    1231

    积分

    [INTOHARD]营长

    Rank: 6Rank: 6

    积分
    1231
    QQ
    发表于 2011-7-9 18:19:42 | 显示全部楼层
    是,全是一堆蜘蛛在爬
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2013-9-26 10:29
  • 签到天数: 69 天

    [LV.6]五品郎中

    1

    主题

    546

    回帖

    619

    积分

    [INTOHARD]连长

    Rank: 4

    积分
    619
    发表于 2011-7-11 13:36:10 | 显示全部楼层
    看不懂.....
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-5-10 18:39
  • 签到天数: 153 天

    [LV.7]四品道员

    6

    主题

    455

    回帖

    1393

    积分

    [INTOHARD]营长

    Rank: 6Rank: 6

    积分
    1393
    发表于 2012-5-6 21:13:03 | 显示全部楼层
    [s:9]给出代码,自己调试一下就明白啦。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    快速回复 返回顶部 返回列表