掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1529|回复: 3

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

[复制链接]

该用户从未签到

发表于 2017-10-17 12:34:08 | 显示全部楼层 |阅读模式
本帖最后由 henices 于 2017-10-17 13:58 编辑
# o8 e1 I8 l% a, l, Z- H- @$ N, A* n& Z- h
http://www.pdawiki.com/forum/thread-21902-1-1.html  [GoldenDict] 如何查看 GoldenDict 下某部词典的 ID ?
' f  a/ o: X0 [& ~/ u
/ E; `' b- n8 O( S
- w) v* U6 m" }9 ?2 u" G

  1. 3 X# A* L+ p) V0 U8 u2 ^
  2. <dictionary name="21**大英汉词典">139305d43503a41a44ebf590fd8f3fae</dictionary>
    ) E. {; |* G; g6 g- H
  3. , P& K! M! w7 G) U! W( e- p0 S
  4. >>> import hashlib
    ! K# [, z+ `7 D0 D' v& Q
  5. >>> hashlib.md5('/home/henices/dictionary/21/21.mdd\0/home/henices/dictionary/21/21.mdx\0').hexdigest()
    6 {2 Y2 P) k, K5 K" k% {! M
  6. '139305d43503a41a44ebf590fd8f3fae'! B3 D$ M% l: o( r' \
复制代码
3 d- G5 f# \& g% u" f0 z; ]

! ^: M2 K+ P. u! u使用的是 md5 哈希, 参见 dictionary.cc  -> makeDictionaryId8 D* i- n: t- d7 y# N. b; d

2 B, I: e4 K/ o: W
  1. % P7 c6 g7 w0 R- C2 [
  2. string makeDictionaryId( vector< string > const & dictionaryFiles ) throw()                                                                                                                    3 H' J+ p7 N9 p8 s1 y+ k
  3. {                                                                                                                                                                                              0 P0 w. B4 I$ ^3 P" U; q* S3 q
  4.   std::vector< string > sortedList;                                                                                                                                                            - |$ }+ z, r7 i: r
  5.                                                                                                                                                                                                
    8 i: n9 m2 Q; s9 e. q. W  W
  6.   if ( Config::isPortableVersion() )                                                                                                                                                             R6 y1 `$ |2 {6 ]8 Z4 s  N9 U
  7.   {                                                                                                                                                                                            ) [! i; N1 k: p
  8.     // For portable version, we use relative paths                                                                                                                                             
    3 o4 T  ?- \* E; X
  9.     sortedList.reserve( dictionaryFiles.size() );                                                                                                                                             
    + {* R5 I  I4 T: L2 _
  10.                                                                                                                                                                                                
    " x$ Q5 `1 t6 `" j
  11.     QDir dictionariesDir( Config::getPortableVersionDictionaryDir() );                                                                                                                         ( d3 w9 q) u" W/ s- l" e
  12.                                                                                                                                                                                                
    ! P/ z# C* X9 {3 {
  13.     for( unsigned x = 0; x < dictionaryFiles.size(); ++x )                                                                                                                                    
    1 N2 J; j/ D% _2 p, d7 N/ f) J
  14.     {                                                                                                                                                                                          
    5 z7 r1 ~9 v  H% W
  15.       string const & full( dictionaryFiles[ x ] );                                                                                                                                             
    ( A  Q9 [5 o; G% W% f
  16.                                                                                                                                                                                                - X- s9 v& Q+ Z- }( e& H! {6 _' u
  17.       QFileInfo fileInfo( FsEncoding::decode( full.c_str() ) );                                                                                                                                8 a( v+ W6 F) q
  18.                                                                                                                                                                                                
    % K9 V; g: ]4 }0 J
  19.       if ( fileInfo.isAbsolute() )                                                                                                                                                            
    5 ]% ^( l, u# R5 {6 u! T6 e
  20.         sortedList.push_back( FsEncoding::encode( dictionariesDir.relativeFilePath( fileInfo.filePath() ) ) );                                                                                 + y! }3 v* U% ?  g9 d; v
  21.       else                                                                                                                                                                                     ; L2 m  J9 z* Y5 }& w  R, m' m
  22.       {                                                                                                                                                                                        7 l! o1 d+ e  Z0 [$ t
  23.         // Well, it's relative. We don't technically support those, but                                                                                                                        
    4 j$ S4 K4 R; O% }4 E
  24.         // what the heck                                                                                                                                                                       
    ( k% Q4 |* M# _3 V( v
  25.         sortedList.push_back( full );                                                                                                                                                         
    4 `6 E2 ?4 G" {1 a8 i. b4 q, R) r  `0 |
  26.       }                                                                                                                                                                                        2 Q) H* X1 u# F% H
  27.     }                                                                                                                                                                                          
    ! _7 R1 z5 O0 l
  28.   }                                                                                                                                                                                            
    5 K8 V3 m( ~" z; U, @
  29.   else                                                                                                                                                                                         
    3 `3 x5 x6 e" ^7 x8 l
  30.     sortedList = dictionaryFiles;                                                                                                                                                              
    ; L. l8 D( q8 x9 |3 V
  31.                                                                                                                                                                                                
    # X5 P* B  Y( X
  32.   std::sort( sortedList.begin(), sortedList.end() );                                                                                                                                          
    - K2 r; [# E3 X4 {
  33.                                                                                                                                                                                                ; u3 R$ l( u- [( J, K  u: C
  34.   QCryptographicHash hash( QCryptographicHash::Md5 );                                                                                                                                          7 q# E* K) I$ [% D$ H; C
  35.                                                                                                                                                                                                / g/ a( g5 E9 z1 f! y( j0 s
  36.   for( std::vector< string >::const_iterator i = sortedList.begin();                                                                                                                           . C# A) w2 Z0 o# o6 {7 v0 \
  37.        i != sortedList.end(); ++i )                                                                                                                                                            
    5 h/ e/ Z6 T' ^5 E* V
  38.     hash.addData( i->c_str(), i->size() + 1 );                                                                                                                                                
    # T3 l0 E; Z1 d$ H+ D& @
  39.                                                                                                                                                                                                3 s2 R$ ^) S4 y- D$ u
  40.   return hash.result().toHex().data();                                                                                                                                                         
      V5 Y  {3 W# d; H# i8 ?. V$ m
  41. } 1 e+ }; f, E) q' n. Q
复制代码

+ l9 Y' n% c! F& T" T# K! l2 P; ~. R) F: l$ R2 k. D
" c8 J0 T/ d9 h2 k- I5 d' @- ~
各种来源的 ID 是随机生成的 (website/wiki/program/...): R7 h7 x( z/ w4 V. s$ t& z9 W
: t9 y9 i# e/ P, }0 [% `2 B% z
sources.cc4 R$ p/ a* W0 P, o$ q" ]( ?

  1. . j; u% Z3 e7 v% ^% s
  2. void ProgramsModel::addNewProgram()                                                                                                                                                            
    0 }& J3 q2 l" ^0 t/ R+ h
  3. {                                                                                                                                                                                             
    % Z- E) ]& x- ~0 ^" I8 ~8 y
  4.   Config::Program p;                                                                                                                                                                           
    ' X5 Y( b" N( u0 v! k6 d8 i
  5.                                                                                                                                                                                                
    - C/ d+ S; a1 j; y6 U3 N% Z
  6.   p.enabled = false;                                                                                                                                                                           
    * Z' }5 R& \7 I$ u' b; W5 X* d
  7.   p.type = Config::Program::Audio;                                                                                                                                                             - w7 C7 c6 }8 m, d, h& ^
  8.                                                                                                                                                                                                9 [$ s1 J" E, g) M: Q, e
  9.   p.id = Dictionary::generateRandomDictionaryId();                                                                                                                                             
    # N  b# I% B- ~+ O  P/ L
  10.                                                                                                                                                                                                
    $ t: X7 {8 L/ B/ P3 {
  11.   beginInsertRows( QModelIndex(), programs.size(), programs.size() );                                                                                                                          * s1 b; o/ n! f- \9 O, v& S) u
  12.   programs.push_back( p );                                                                                                                                                                     0 @) g  l; `' H4 f, O
  13.   endInsertRows();                                                                                                                                                                             
    , n+ `& ?; g* j; i. O% }/ a; M
  14. } ; r# c# H8 f3 g, Z" n& d
复制代码
9 R" K8 p+ L5 ~- E( V9 e+ b

0 ]$ q! b0 v( g  f0 d" adictionary.cc
  M' x6 U, p0 t! G% G- X

  1. + T& ?  d. p; k5 \) A0 V
  2. QString generateRandomDictionaryId()                                                                                                                                                           - H/ C7 S+ @7 P) V% o* A
  3. {                                                                                                                                                                                             
    - C" ^1 i+ J9 {4 l0 S
  4.   return QString(                                                                                                                                                                              
    ( m0 o3 l. O  U8 N" a0 H# k
  5.     QCryptographicHash::hash(                                                                                                                                                                  + w5 c3 O' B" }: ?, n  I+ }
  6.       QDateTime::currentDateTime().toString( ""Random"dd.MM.yyyy hh:mm:ss.zzz" ).toUtf8(),                                                                                                   : Z6 z% l7 O; f3 U9 F
  7.       QCryptographicHash::Md5 ).toHex() );                                                                                                                                                     6 N- j& r& t7 O/ g! S9 k
  8. }
    4 c4 R: h# P) h( _* p* F7 C. K7 z* K
复制代码

3 t. s7 A- o  [% |7 O# L7 N

评分

5

查看全部评分

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

    [LV.4]偶尔看看III

    发表于 2018-12-11 20:08:59 | 显示全部楼层
    本帖最后由 浔阳巷陌 于 2018-12-11 20:12 编辑
    4 s" _6 l9 N" R8 F2 [/ D  r4 N0 q* U' U# O( }9 r
    赞!
      p7 U, B8 V, c5 h* P0 @) n# s7 B我用的是便携版的 Goldendict (Win10, 64bit), 有样学样,用了论坛里的汉典测试楼主的示例代码成功(看不懂源代码...)。相对目录的排列差点使我放弃治疗。
    4 e* W" B; U  S/ V1 p5 R7 I, l
    1. >>> import hashlib
      1 M( B8 w: k( Y# q9 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()
      + @$ d  ]- H4 k# Y, p
    3. d29a3da26022910808bacbf24a3f1e9
    复制代码
    , B$ o. V4 h" m% q6 F  ^
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2017-10-17 13:12:32 | 显示全部楼层
    goldendict会修改词典id的名字, 于是用id来操作的js 就会出问题, 有比较好的解决方法么?) _  L* K, w' h; J1 ]
    比如id名称重新映射?

    该用户从未签到

    发表于 2021-10-28 16:59:21 | 显示全部楼层
    'D://dictionary//ENG//test.dsl\0'! O+ X9 D7 g: h6 K+ Q
    使用网络上现成的MD5简单JavaScript代码也可以生成正确的id
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2024-3-28 22:50 , Processed in 0.031773 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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