掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1678|回复: 3

[经验交流] GoldenDict 词典 ID 生成算法

[复制链接]

该用户从未签到

发表于 2017-10-17 12:34:08 | 显示全部楼层 |阅读模式
本帖最后由 henices 于 2017-10-17 13:58 编辑 " b+ z) `0 G5 Y* y& c! G4 }9 ~

: D  l# j+ n& ^5 t" c! S/ Ahttp://www.pdawiki.com/forum/thread-21902-1-1.html  [GoldenDict] 如何查看 GoldenDict 下某部词典的 ID ?9 H4 v* e) F. g' s! C" @: l# ^
9 M  o/ F% Q" o

1 x4 m; c8 f( }$ j2 N* Z; r

  1. * W$ A- B& t. P
  2. <dictionary name="21**大英汉词典">139305d43503a41a44ebf590fd8f3fae</dictionary>! ]$ g% `! |) L9 U3 [' V

  3. ) L5 p' |5 `7 H4 D2 R
  4. >>> import hashlib 9 s. K  ^2 W' I* ^( F7 q' L
  5. >>> hashlib.md5('/home/henices/dictionary/21/21.mdd\0/home/henices/dictionary/21/21.mdx\0').hexdigest()
    + Y( @9 N/ B3 @4 R
  6. '139305d43503a41a44ebf590fd8f3fae'; X" a0 [8 W. l& t; E" z
复制代码

4 k6 U- p1 Y. f
4 D: J3 i: E1 o* N$ h# p9 y使用的是 md5 哈希, 参见 dictionary.cc  -> makeDictionaryId8 n* X( j! z: a1 r; E1 X: E9 u/ ~
: {' Q, Z" }( |% w, `

  1. 2 F  R! k# d+ ~  Z5 P2 `" _
  2. string makeDictionaryId( vector< string > const & dictionaryFiles ) throw()                                                                                                                    
    8 e. q! \! X/ K+ y: j: L
  3. {                                                                                                                                                                                             
    # y3 V  O4 V7 ?8 T8 j& h
  4.   std::vector< string > sortedList;                                                                                                                                                            ! h, s$ V5 Y9 C' L
  5.                                                                                                                                                                                                
    9 v) k( t3 C, N) `
  6.   if ( Config::isPortableVersion() )                                                                                                                                                           
    $ F5 `6 l8 X/ p2 A9 ]
  7.   {                                                                                                                                                                                            - {/ J3 Z# A3 `2 l5 {: G
  8.     // For portable version, we use relative paths                                                                                                                                             
    3 X7 [  R1 Z. n* x
  9.     sortedList.reserve( dictionaryFiles.size() );                                                                                                                                             
    8 [5 @2 l" ^  c; n8 r: a
  10.                                                                                                                                                                                                9 s" n1 _7 ?. P1 e+ b
  11.     QDir dictionariesDir( Config::getPortableVersionDictionaryDir() );                                                                                                                         7 Z- @( F) _- F( [
  12.                                                                                                                                                                                                
    % b: w, U5 n/ P5 E' d6 q
  13.     for( unsigned x = 0; x < dictionaryFiles.size(); ++x )                                                                                                                                    
    " p+ H. V* h- D0 R
  14.     {                                                                                                                                                                                          ' Q1 b- A: Y# L
  15.       string const & full( dictionaryFiles[ x ] );                                                                                                                                             - u. v0 Z* U2 N* t4 k
  16.                                                                                                                                                                                                7 U3 d: G; X3 E3 P; n
  17.       QFileInfo fileInfo( FsEncoding::decode( full.c_str() ) );                                                                                                                                0 v0 D5 }) d/ M  Q( A) G
  18.                                                                                                                                                                                                
    ) e5 ]+ ^/ R% `1 W
  19.       if ( fileInfo.isAbsolute() )                                                                                                                                                             8 [$ y5 U: n( L; G
  20.         sortedList.push_back( FsEncoding::encode( dictionariesDir.relativeFilePath( fileInfo.filePath() ) ) );                                                                                 ! _$ w2 I# K, G0 p7 W$ G; j( h$ Q: Y
  21.       else                                                                                                                                                                                    
    9 {2 @7 H1 B: j0 J; Q
  22.       {                                                                                                                                                                                       
    2 d+ f. @( n* s+ [) {: T0 D
  23.         // Well, it's relative. We don't technically support those, but                                                                                                                        0 k! c. k7 M* S5 e! q
  24.         // what the heck                                                                                                                                                                       
    - s1 l4 T! |0 \4 \; ^! j4 l
  25.         sortedList.push_back( full );                                                                                                                                                          % F' C" n0 s) f0 I" K
  26.       }                                                                                                                                                                                        : `  g9 O# f( d4 d1 B2 W4 N
  27.     }                                                                                                                                                                                          
    3 K% |. U6 h8 Z% e7 F! i) ^! w5 Y6 V
  28.   }                                                                                                                                                                                            ! T, t4 _, s) }3 n& e$ }
  29.   else                                                                                                                                                                                         
    , X! G( f5 P) q+ G* j/ z; W1 J
  30.     sortedList = dictionaryFiles;                                                                                                                                                              
    6 e' J# O' _4 T( u4 K  ^8 B
  31.                                                                                                                                                                                                , d2 P3 \9 b; I1 R
  32.   std::sort( sortedList.begin(), sortedList.end() );                                                                                                                                          
    2 ?7 v! P" C& y5 p
  33.                                                                                                                                                                                                : b) r8 E. ]9 }2 ?+ s, W
  34.   QCryptographicHash hash( QCryptographicHash::Md5 );                                                                                                                                          
    ' D( D; g% H( i2 W8 w" ], m/ I
  35.                                                                                                                                                                                                
    9 ^2 O; I8 K7 B* g2 U1 i4 c
  36.   for( std::vector< string >::const_iterator i = sortedList.begin();                                                                                                                           # W" W, A( v. }! j3 v, K8 z
  37.        i != sortedList.end(); ++i )                                                                                                                                                            5 o% Z: |, D- f( |7 q
  38.     hash.addData( i->c_str(), i->size() + 1 );                                                                                                                                                 4 T9 n' T3 f( Z" u8 m' P
  39.                                                                                                                                                                                                
    7 \) r5 k: w) Z; {8 x* Y; h
  40.   return hash.result().toHex().data();                                                                                                                                                         : u) B/ G2 y' t! S6 H! y6 g* C5 Z
  41. } ; I9 y7 k! J# o* v- ?! T
复制代码
* a& z) ?7 f- B% c  M
( [* U) C+ n% I$ Y" {# |6 O

8 f4 U( S1 ~) I+ R, i$ G, X各种来源的 ID 是随机生成的 (website/wiki/program/...)
* M$ z# x5 N0 E7 ?7 u( h
0 t2 w# X$ ?9 ]- q2 G; m+ C8 msources.cc6 P# L' X, t' ^

  1. - A& n8 t7 w3 p" l
  2. void ProgramsModel::addNewProgram()                                                                                                                                                            
    8 |/ c  o( A2 X8 ?. |8 `
  3. {                                                                                                                                                                                              2 u9 Z  h, X, Q3 G! P) F) d- W
  4.   Config::Program p;                                                                                                                                                                           
    1 h; L3 P; K( e( z; j
  5.                                                                                                                                                                                                7 Y1 L9 ~; J* I5 s+ W, u
  6.   p.enabled = false;                                                                                                                                                                           
    2 ~) U- e6 l3 ?9 c: T
  7.   p.type = Config::Program::Audio;                                                                                                                                                             & M/ E+ G2 e8 E
  8.                                                                                                                                                                                                
    7 F7 G- ]- I0 u* e
  9.   p.id = Dictionary::generateRandomDictionaryId();                                                                                                                                             
    : P& v* C( p! u- d
  10.                                                                                                                                                                                                4 D% s& j. D& j5 x
  11.   beginInsertRows( QModelIndex(), programs.size(), programs.size() );                                                                                                                          
    & j1 X9 X7 R$ X3 Y# K
  12.   programs.push_back( p );                                                                                                                                                                     
    . M9 `5 c+ d) Z9 Q
  13.   endInsertRows();                                                                                                                                                                             
    * q3 `  B7 m3 ?! j8 ]8 e- y
  14. }
    3 Y0 `' J% O7 i( E" P! N
复制代码
; g/ @9 M. w# a
7 W8 `6 V" D! ~. N3 C5 F
dictionary.cc 3 N$ U5 e6 {9 }, l2 K# E
  1. * P! j6 q1 c. @7 Q& s
  2. QString generateRandomDictionaryId()                                                                                                                                                           
    ( h7 H9 V' k" p, I$ t
  3. {                                                                                                                                                                                             
    ) v% B: A! ?3 y; r
  4.   return QString(                                                                                                                                                                              ' z0 H: L, S9 f0 ~. k
  5.     QCryptographicHash::hash(                                                                                                                                                                  
    3 K# H8 Z7 [5 Y; _; y
  6.       QDateTime::currentDateTime().toString( ""Random"dd.MM.yyyy hh:mm:ss.zzz" ).toUtf8(),                                                                                                   
    $ v+ A- q& N2 ]
  7.       QCryptographicHash::Md5 ).toHex() );                                                                                                                                                     5 w$ P% }9 `3 _$ [0 O# a, Z
  8. } 6 A! B4 t  X8 c) s, a  p; g. ]8 A
复制代码

; t9 C/ F; x; K

评分

5

查看全部评分

  • TA的每日心情
    开心
    2018-12-28 00:32
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    发表于 2018-12-11 20:08:59 | 显示全部楼层
    本帖最后由 浔阳巷陌 于 2018-12-11 20:12 编辑
    2 M& u* Q( p8 P; _, V, b1 G3 |3 n( h6 C' b% p! E7 i# X5 V
    赞!: v4 O: p$ ^/ Q4 N* O: \4 K' i
    我用的是便携版的 Goldendict (Win10, 64bit), 有样学样,用了论坛里的汉典测试楼主的示例代码成功(看不懂源代码...)。相对目录的排列差点使我放弃治疗。. z, {! X6 s; s; V
    1. >>> import hashlib; j3 l: j6 ]# P+ [: d( m' }
    2. >>> hashlib.md5('Dictionaries/CN/汉典_by_ldlcau_20120920/hd.1.mdd\x00Dictionaries/CN/汉典_by_ldlcau_20120920/hd.mdd\x00Dictionaries/CN/汉典_by_ldlcau_20120920/hd.mdx\x00'.encode()).hexdigest()0 Q# v6 D8 l: w3 }$ k  L
    3. d29a3da26022910808bacbf24a3f1e9
    复制代码

    ( J* m' K/ v& f& [! u- D: O
  • TA的每日心情

    2019-9-20 08:37
  • 签到天数: 214 天

    [LV.7]常住居民III

    发表于 2017-10-17 13:12:32 | 显示全部楼层
    goldendict会修改词典id的名字, 于是用id来操作的js 就会出问题, 有比较好的解决方法么?
    / w: \( Q. `/ m. U; b5 d5 }比如id名称重新映射?

    该用户从未签到

    发表于 2021-10-28 16:59:21 | 显示全部楼层
    'D://dictionary//ENG//test.dsl\0'# ~# m; Y( W9 H" H9 |- q  g& f8 F
    使用网络上现成的MD5简单JavaScript代码也可以生成正确的id
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

    小黑屋|手机版|Archiver|PDAWIKI |网站地图

    GMT+8, 2024-6-15 19:49 , Processed in 0.046522 second(s), 12 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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