掌上百科 - PDAWIKI

 找回密码
 免费注册

QQ登录

只需一步,快速开始

查看: 2005|回复: 3

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

[复制链接]

该用户从未签到

发表于 2017-10-17 12:34:08 | 显示全部楼层 |阅读模式
本帖最后由 henices 于 2017-10-17 13:58 编辑
- P& Y: \  Z; G$ |
+ n- q/ e- i, Z, R6 P) \. thttp://www.pdawiki.com/forum/thread-21902-1-1.html  [GoldenDict] 如何查看 GoldenDict 下某部词典的 ID ?- T# q# h" w* N" j; m; B1 @9 `& w
; t5 v) g8 Y9 B8 ?; @
+ E* Z+ K1 ^8 q' j* l$ ~9 s
  1. & f7 y8 n+ h' M! E
  2. <dictionary name="21**大英汉词典">139305d43503a41a44ebf590fd8f3fae</dictionary>3 N& E: `- v  k
  3. 6 J5 x# R- b9 O; a7 \2 X
  4. >>> import hashlib / N3 o% B2 X  t" d' \4 U. S
  5. >>> hashlib.md5('/home/henices/dictionary/21/21.mdd\0/home/henices/dictionary/21/21.mdx\0').hexdigest()
    / e4 L9 k) ?6 H1 G
  6. '139305d43503a41a44ebf590fd8f3fae'
    # l# v1 C) n% e% Z
复制代码

& n, F1 ]5 @+ l( v# M& |4 p  C, [, F5 ~3 e( C6 |, U+ @0 i  H
使用的是 md5 哈希, 参见 dictionary.cc  -> makeDictionaryId& ]. L* e: U8 M

8 Y, z1 v5 H' @; p3 c

  1. 7 H6 W# c9 [; Q+ c8 @7 D0 p. E
  2. string makeDictionaryId( vector< string > const & dictionaryFiles ) throw()                                                                                                                    " N0 x' i& W$ i' W) g
  3. {                                                                                                                                                                                              0 B% x: J3 u# e) ^
  4.   std::vector< string > sortedList;                                                                                                                                                            5 ~( [( [: Q0 o3 k( i  A, ?) M3 s
  5.                                                                                                                                                                                                
    % H6 S0 X3 t  {5 J* ^
  6.   if ( Config::isPortableVersion() )                                                                                                                                                           0 P% {- ]# C4 C$ w. Y
  7.   {                                                                                                                                                                                            
    9 s0 l: l+ F7 J! S& e1 Q2 N& {# ^: u3 D
  8.     // For portable version, we use relative paths                                                                                                                                             + K: r9 J9 x, ?7 [; _: h
  9.     sortedList.reserve( dictionaryFiles.size() );                                                                                                                                             
    6 q' @. p4 U. O  K0 t- a7 j3 w
  10.                                                                                                                                                                                                ' m+ q# |$ ~. k; {5 S
  11.     QDir dictionariesDir( Config::getPortableVersionDictionaryDir() );                                                                                                                         7 N  |7 |3 j6 N# e( g$ e9 P, f
  12.                                                                                                                                                                                                
    5 {% \7 Y4 a/ p) M+ J
  13.     for( unsigned x = 0; x < dictionaryFiles.size(); ++x )                                                                                                                                     ' X2 v! o& R4 ^' D
  14.     {                                                                                                                                                                                          5 [  L% w& Q$ Q5 `- l+ A  x
  15.       string const & full( dictionaryFiles[ x ] );                                                                                                                                             
    4 ~7 q! D7 A) _0 I0 @8 W
  16.                                                                                                                                                                                                
    + s, m; h6 Z( Z2 `5 @
  17.       QFileInfo fileInfo( FsEncoding::decode( full.c_str() ) );                                                                                                                                
    ; W- Q2 b* j: E: C$ J8 v5 ^+ q) a
  18.                                                                                                                                                                                                $ E  g  q0 R; ]2 u
  19.       if ( fileInfo.isAbsolute() )                                                                                                                                                            
    0 A* Q/ A) F& H% \% w/ Z# I
  20.         sortedList.push_back( FsEncoding::encode( dictionariesDir.relativeFilePath( fileInfo.filePath() ) ) );                                                                                 . u9 c& k4 T9 T* w$ ?
  21.       else                                                                                                                                                                                    
    . L. Q0 u7 K9 [" w3 J0 p1 q
  22.       {                                                                                                                                                                                        - F+ d# X4 P/ j1 n) K
  23.         // Well, it's relative. We don't technically support those, but                                                                                                                        
    * ?# H" h0 K2 U2 ]% e9 m/ G/ U$ ~
  24.         // what the heck                                                                                                                                                                       
    * A* _- \# c" J& l0 t0 h
  25.         sortedList.push_back( full );                                                                                                                                                          0 J" ?2 Z6 j& G, A/ S
  26.       }                                                                                                                                                                                        * ]9 p' K/ j: G5 V( O; ^
  27.     }                                                                                                                                                                                          
    0 V3 G6 U5 Z% G6 l& I2 ?$ n1 f" q; ]' _
  28.   }                                                                                                                                                                                            ( j; f8 n4 T8 w. w3 o- h4 c
  29.   else                                                                                                                                                                                         ! z$ U% v# X& h3 J
  30.     sortedList = dictionaryFiles;                                                                                                                                                              , x3 O, V7 u( b& }4 W0 v
  31.                                                                                                                                                                                                
    + h5 H5 P3 u8 Z5 S' X: W" R  S
  32.   std::sort( sortedList.begin(), sortedList.end() );                                                                                                                                           . M& A0 ^' Z) @/ g: J" g* J0 N
  33.                                                                                                                                                                                                2 o3 e* C5 H4 N4 w5 D! h2 k" Q) M
  34.   QCryptographicHash hash( QCryptographicHash::Md5 );                                                                                                                                          
    # U- n7 `* ?9 `( g
  35.                                                                                                                                                                                                ! |- A; M" ]0 G/ M- o+ S/ l9 b
  36.   for( std::vector< string >::const_iterator i = sortedList.begin();                                                                                                                           
    7 @9 n% q9 p8 K) g4 u0 {
  37.        i != sortedList.end(); ++i )                                                                                                                                                            , x/ c& p: v* x6 e
  38.     hash.addData( i->c_str(), i->size() + 1 );                                                                                                                                                 # ~9 ~2 R) M& f# O) ?
  39.                                                                                                                                                                                                . d$ n8 B+ v  Q1 Y
  40.   return hash.result().toHex().data();                                                                                                                                                         3 z3 d5 t* a$ o3 \9 J- C4 W! z  P
  41. } 1 t% |4 y4 W; ]$ Q& D8 p
复制代码
: O! [; W6 L6 N" r; i1 ?9 j3 h0 g/ s

5 W' m) V6 [3 \0 f5 l+ H5 {% v6 o! Y* x, u  h8 m" A/ S
各种来源的 ID 是随机生成的 (website/wiki/program/...)# ?: k9 z& X' T* a0 P% A- Q

8 s/ j) \3 X2 Z9 tsources.cc
# o" A- }2 {1 V2 H. n

  1. : T4 {! _. K/ ]3 }3 b, _
  2. void ProgramsModel::addNewProgram()                                                                                                                                                            
    $ b/ {5 V& X8 v% e. G" A( d' w
  3. {                                                                                                                                                                                             
    + E8 O& a2 y2 R% h/ Y5 Q
  4.   Config::Program p;                                                                                                                                                                           
    : P  a- P3 v4 t1 M0 m7 G, H
  5.                                                                                                                                                                                                # [% k. \% c) R& ~/ W
  6.   p.enabled = false;                                                                                                                                                                           
    % _' ]3 X/ }7 l7 _
  7.   p.type = Config::Program::Audio;                                                                                                                                                             + A, Z2 I$ p5 `9 a- g1 S% |
  8.                                                                                                                                                                                                
    9 B' f$ M2 _# t. c5 l
  9.   p.id = Dictionary::generateRandomDictionaryId();                                                                                                                                             " Z& m' N" K: r; d. H
  10.                                                                                                                                                                                                7 R3 D; P% J$ e2 x
  11.   beginInsertRows( QModelIndex(), programs.size(), programs.size() );                                                                                                                          
    ; l& D9 _$ d+ I% [
  12.   programs.push_back( p );                                                                                                                                                                     ' ]+ O( Y  n9 ^- F" u
  13.   endInsertRows();                                                                                                                                                                             
    ! [, j9 Y. V" U  K
  14. } - X0 n. N) x( O% w
复制代码

, M0 e  G! ?9 }" X% y& l$ J  ^# N9 a+ W0 S# x0 x' o6 h
dictionary.cc   L9 }3 j7 Z# ^, Z# T

  1. 1 g. _% T8 v, m3 g& v" h
  2. QString generateRandomDictionaryId()                                                                                                                                                           ; O& |/ t! w" ]: u( O
  3. {                                                                                                                                                                                             
    / A) Y0 h" l+ v3 ?
  4.   return QString(                                                                                                                                                                              0 @" I' [6 l! m7 j
  5.     QCryptographicHash::hash(                                                                                                                                                                  # J, u6 d, O$ f3 Y0 \# z
  6.       QDateTime::currentDateTime().toString( ""Random"dd.MM.yyyy hh:mm:ss.zzz" ).toUtf8(),                                                                                                   
    9 S7 F0 ?7 A! R1 `& V2 ^3 k4 z6 _4 U
  7.       QCryptographicHash::Md5 ).toHex() );                                                                                                                                                     : X' g7 A& d+ Y
  8. } 4 w0 t  O) I0 E. O" a5 P/ Y5 ?
复制代码

! W( X8 f% y$ _) A; K* p

评分

5

查看全部评分

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

    [LV.4]偶尔看看III

    发表于 2018-12-11 20:08:59 | 显示全部楼层
    本帖最后由 浔阳巷陌 于 2018-12-11 20:12 编辑
    " w% ^2 v6 }- D) y& ^1 b
    ! N3 Z# m- L7 b赞!- T7 i. c9 L7 Z4 D. q
    我用的是便携版的 Goldendict (Win10, 64bit), 有样学样,用了论坛里的汉典测试楼主的示例代码成功(看不懂源代码...)。相对目录的排列差点使我放弃治疗。4 y3 `1 X! @+ ^$ r
    1. >>> import hashlib
      - j5 {; v4 y. o6 K8 `
    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()$ N3 X3 |" z: d0 [, N4 b6 ?
    3. d29a3da26022910808bacbf24a3f1e9
    复制代码

    7 f, b6 ]! S5 |8 V0 @' ^. t
  • TA的每日心情

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

    [LV.7]常住居民III

    发表于 2017-10-17 13:12:32 | 显示全部楼层
    goldendict会修改词典id的名字, 于是用id来操作的js 就会出问题, 有比较好的解决方法么?' S. |- L/ |" g% ^- R
    比如id名称重新映射?

    该用户从未签到

    发表于 2021-10-28 16:59:21 | 显示全部楼层
    'D://dictionary//ENG//test.dsl\0'. `! n3 r( b. N) L
    使用网络上现成的MD5简单JavaScript代码也可以生成正确的id
    您需要登录后才可以回帖 登录 | 免费注册

    本版积分规则

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

    GMT+8, 2025-4-27 20:39 , Processed in 0.022413 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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