掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 1571|回复: 3

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

[复制链接]

该用户从未签到

发表于 2017-10-17 12:34:08 | 显示全部楼层 |阅读模式
本帖最后由 henices 于 2017-10-17 13:58 编辑 ) A9 A# o, P% d" G6 d" p" M
, T+ K3 A( k0 n+ b9 o
http://www.pdawiki.com/forum/thread-21902-1-1.html  [GoldenDict] 如何查看 GoldenDict 下某部词典的 ID ?$ A$ E4 p6 o0 I7 }' t8 t# U
. ^( Z" u# L+ k$ r1 Q
% Q& C, k- U+ B6 {
  1. 0 F1 k8 |6 p+ J1 J( ]
  2. <dictionary name="21**大英汉词典">139305d43503a41a44ebf590fd8f3fae</dictionary>1 E0 b1 y* U6 f
  3. % g$ j5 {- B  `+ d
  4. >>> import hashlib
    1 X( }7 T4 q9 s' x
  5. >>> hashlib.md5('/home/henices/dictionary/21/21.mdd\0/home/henices/dictionary/21/21.mdx\0').hexdigest()
    4 L- H! ]  x" r3 P6 s' b# D
  6. '139305d43503a41a44ebf590fd8f3fae'9 _$ y* O( w! r6 @! T
复制代码

1 S$ m" J' y' a) g+ \1 ?" z
& Z8 J7 w% C- }使用的是 md5 哈希, 参见 dictionary.cc  -> makeDictionaryId0 E, k5 `, B' g) Z0 x
. f# x! J! j5 B- w
  1. 5 ?, i: \1 Z7 c7 ~
  2. string makeDictionaryId( vector< string > const & dictionaryFiles ) throw()                                                                                                                    
    7 c: m3 p/ Z  X! {: V
  3. {                                                                                                                                                                                              9 T4 ]- g  X" V, V8 D0 K/ G
  4.   std::vector< string > sortedList;                                                                                                                                                            2 ~& ?: X5 B, r$ b, J
  5.                                                                                                                                                                                                . O, O/ w3 b; S
  6.   if ( Config::isPortableVersion() )                                                                                                                                                           
    - _! X. C. b  W5 K1 C0 r
  7.   {                                                                                                                                                                                            
    % \0 Q" x0 I0 e/ S# v9 p; {
  8.     // For portable version, we use relative paths                                                                                                                                             
    5 k- V) v  {1 o5 H: m% I
  9.     sortedList.reserve( dictionaryFiles.size() );                                                                                                                                             
    9 k" W& k. \) m' ^2 J' m) ^  [' [, g: j
  10.                                                                                                                                                                                                / N* O0 U6 ?) D( |4 o1 }4 o
  11.     QDir dictionariesDir( Config::getPortableVersionDictionaryDir() );                                                                                                                         6 E9 }: k' [9 o2 w9 ?, I# l
  12.                                                                                                                                                                                                
    ; R8 @4 p5 s" ]6 D, k
  13.     for( unsigned x = 0; x < dictionaryFiles.size(); ++x )                                                                                                                                    
    ; k* O! h" V! u: F; h, |
  14.     {                                                                                                                                                                                          
    ; N, E+ \) r0 c/ x4 H4 [
  15.       string const & full( dictionaryFiles[ x ] );                                                                                                                                             
    6 P4 B3 p. S( O3 D, Q, O
  16.                                                                                                                                                                                                
    4 t- w: }* B# t" a- d
  17.       QFileInfo fileInfo( FsEncoding::decode( full.c_str() ) );                                                                                                                                # @5 t( ^% m. L- _. b7 c9 J9 r3 e$ D
  18.                                                                                                                                                                                                
    - @" `$ |$ M, ~1 O4 j
  19.       if ( fileInfo.isAbsolute() )                                                                                                                                                             ( C* u# E% {( D+ M% D
  20.         sortedList.push_back( FsEncoding::encode( dictionariesDir.relativeFilePath( fileInfo.filePath() ) ) );                                                                                 , C* W( ^9 j- n+ ^& b* I8 P1 R) h) z8 ~
  21.       else                                                                                                                                                                                    
    3 [7 I. `$ n( V3 ^' W
  22.       {                                                                                                                                                                                        % _& X5 ~& f3 A! y0 s1 A/ g0 A' b
  23.         // Well, it's relative. We don't technically support those, but                                                                                                                        ) W) L; t# J; n) ^
  24.         // what the heck                                                                                                                                                                       
    8 S' U. S0 l9 m* ^; a8 |! W
  25.         sortedList.push_back( full );                                                                                                                                                         
    * _/ D4 Q( ~3 r5 l2 f" \% r
  26.       }                                                                                                                                                                                        8 B# v, o5 Z0 v% i
  27.     }                                                                                                                                                                                          
    6 y/ F/ b. M- o/ F: T0 [1 P# o, S
  28.   }                                                                                                                                                                                            , J9 _7 C/ l& C$ |5 v! G+ J  w" A
  29.   else                                                                                                                                                                                         
    3 x& o3 D! G( v
  30.     sortedList = dictionaryFiles;                                                                                                                                                              % D. L. j4 Q+ \: j; f- b7 I* y, B
  31.                                                                                                                                                                                                
    - P8 U' _, B, T- i6 F6 Y* m
  32.   std::sort( sortedList.begin(), sortedList.end() );                                                                                                                                          
    ; ]% g8 W( l+ G
  33.                                                                                                                                                                                                
    9 ?5 ^' K. n6 n& `/ i& l
  34.   QCryptographicHash hash( QCryptographicHash::Md5 );                                                                                                                                          & D7 ?0 C# ]9 Y+ K' Q) ]
  35.                                                                                                                                                                                                3 T* ^/ w6 U3 X2 j: F- C' e: [. y
  36.   for( std::vector< string >::const_iterator i = sortedList.begin();                                                                                                                           ! @6 e' `7 Y0 t7 Q+ E( [
  37.        i != sortedList.end(); ++i )                                                                                                                                                            
    8 |. ^$ C+ M5 Z6 ?  V$ ^
  38.     hash.addData( i->c_str(), i->size() + 1 );                                                                                                                                                
    , C; v: r9 t( w! j, x' l
  39.                                                                                                                                                                                                
    ! ]. f3 T& ^4 l/ r1 y$ U" h
  40.   return hash.result().toHex().data();                                                                                                                                                         1 l& R  j! l4 F. n3 |) w- v6 f. ?
  41. } ; _) H1 ?5 S4 o, D4 I
复制代码
/ ?) S2 R! R3 E# Q# b. v3 U

( R5 n% j  l; i2 `: [; l$ Y# A* i/ E& H5 J& `" s
各种来源的 ID 是随机生成的 (website/wiki/program/...)
# C' R. C; l  H; D
& N4 C/ S! `' [4 O/ K, |sources.cc- Z) U* ~0 B0 ]2 r8 X' P3 N7 \4 T) c
  1. * d& B4 ?6 J" A/ @# P
  2. void ProgramsModel::addNewProgram()                                                                                                                                                            ' ~, W/ J. k! ], s+ ~
  3. {                                                                                                                                                                                              $ u) f9 [( i4 r0 l
  4.   Config::Program p;                                                                                                                                                                           : F" @. s6 {, y, i, @
  5.                                                                                                                                                                                                6 K$ J: B6 r/ v% j; C
  6.   p.enabled = false;                                                                                                                                                                           1 W1 j' L1 g0 L' D0 w
  7.   p.type = Config::Program::Audio;                                                                                                                                                            
    3 u. |, t: `" ^/ b: \# ?
  8.                                                                                                                                                                                                
    5 S# f  A& _/ a8 _5 r; B/ _# I
  9.   p.id = Dictionary::generateRandomDictionaryId();                                                                                                                                             
    ; C0 j, \$ ]* v; X9 G2 b& o
  10.                                                                                                                                                                                                
    + C9 F9 H0 y4 G5 c5 u2 Q
  11.   beginInsertRows( QModelIndex(), programs.size(), programs.size() );                                                                                                                          
      J; p- n8 {# \
  12.   programs.push_back( p );                                                                                                                                                                     
    + ]3 A% ^$ |$ F. B" F
  13.   endInsertRows();                                                                                                                                                                             3 O6 [. a; g' ~: T4 x# x
  14. }
    4 i6 O. _: q  b: U; \( }
复制代码

; f$ }& g! k1 V  t& i2 }, a: a; {: F7 e! W  }- \" |. d
dictionary.cc
3 y5 ?  ]$ r: F9 I

  1. ' ]8 e( I+ F& U3 J7 }- [& ~
  2. QString generateRandomDictionaryId()                                                                                                                                                           
    8 C3 O- ?! B% w# m3 E* k0 P, x+ r
  3. {                                                                                                                                                                                             
    , z8 R" H) f5 |, L0 w9 K# J0 C, j
  4.   return QString(                                                                                                                                                                              9 P: Q9 S  C& N. Y5 i
  5.     QCryptographicHash::hash(                                                                                                                                                                  4 E$ W- q7 Q; v+ N  J
  6.       QDateTime::currentDateTime().toString( ""Random"dd.MM.yyyy hh:mm:ss.zzz" ).toUtf8(),                                                                                                   
    3 k) f+ c; I: B4 I" q- ]
  7.       QCryptographicHash::Md5 ).toHex() );                                                                                                                                                     / m5 m4 M: J7 E2 C1 `
  8. } " ]  C4 l/ q3 }1 n- J; L& J
复制代码
, s" E- D0 Q9 e; N; X

评分

5

查看全部评分

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

    [LV.4]偶尔看看III

    发表于 2018-12-11 20:08:59 | 显示全部楼层
    本帖最后由 浔阳巷陌 于 2018-12-11 20:12 编辑 4 V) k2 G# U. U( S  [

    7 c8 {8 y# ^4 d/ C赞!5 C" B- \0 V6 _+ P1 v% a
    我用的是便携版的 Goldendict (Win10, 64bit), 有样学样,用了论坛里的汉典测试楼主的示例代码成功(看不懂源代码...)。相对目录的排列差点使我放弃治疗。
    . _) k% J( q3 D; s0 Y5 v
    1. >>> import hashlib' R9 l1 m$ R  R3 w/ V$ w+ Y( M$ d
    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()& L( ^  N$ k. T  _, F7 x7 ?
    3. d29a3da26022910808bacbf24a3f1e9
    复制代码

    9 k! N6 G4 @, |* n
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2017-10-17 13:12:32 | 显示全部楼层
    goldendict会修改词典id的名字, 于是用id来操作的js 就会出问题, 有比较好的解决方法么?
    ) `( k. N& o! G4 @: L) i8 i比如id名称重新映射?

    该用户从未签到

    发表于 2021-10-28 16:59:21 | 显示全部楼层
    'D://dictionary//ENG//test.dsl\0'. X6 Z* C* F( d" n6 x
    使用网络上现成的MD5简单JavaScript代码也可以生成正确的id
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2024-4-23 23:06 , Processed in 0.042713 second(s), 10 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2023, Tencent Cloud.

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