1 /**
2  * Orthanc - A Lightweight, RESTful DICOM Store
3  * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
4  * Department, University Hospital of Liege, Belgium
5  * Copyright (C) 2017-2021 Osimis S.A., Belgium
6  *
7  * This program is free software: you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public License
9  * as published by the Free Software Foundation, either version 3 of
10  * the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this program. If not, see
19  * <http://www.gnu.org/licenses/>.
20  **/
21 
22 
23 #pragma once
24 
25 #include "DicomMap.h"
26 
27 namespace Orthanc
28 {
29   /**
30    * This class implements the hashing mechanism that is used to
31    * convert DICOM unique identifiers to Orthanc identifiers. Any
32    * Orthanc identifier for a DICOM resource corresponds to the SHA-1
33    * hash of the DICOM identifiers.
34 
35    * \note SHA-1 hash is used because it is less sensitive to
36    * collision attacks than MD5. <a
37    * href="http://en.wikipedia.org/wiki/SHA-256#Comparison_of_SHA_functions">[Reference]</a>
38    **/
39   class ORTHANC_PUBLIC DicomInstanceHasher
40   {
41   private:
42     std::string patientId_;
43     std::string studyUid_;
44     std::string seriesUid_;
45     std::string instanceUid_;
46 
47     std::string patientHash_;
48     std::string studyHash_;
49     std::string seriesHash_;
50     std::string instanceHash_;
51 
52     void Setup(const std::string& patientId,
53                const std::string& studyUid,
54                const std::string& seriesUid,
55                const std::string& instanceUid);
56 
57   public:
58     explicit DicomInstanceHasher(const DicomMap& instance);
59 
60     DicomInstanceHasher(const std::string& patientId,
61                         const std::string& studyUid,
62                         const std::string& seriesUid,
63                         const std::string& instanceUid);
64 
65     const std::string& GetPatientId() const;
66 
67     const std::string& GetStudyUid() const;
68 
69     const std::string& GetSeriesUid() const;
70 
71     const std::string& GetInstanceUid() const;
72 
73     const std::string& HashPatient();
74 
75     const std::string& HashStudy();
76 
77     const std::string& HashSeries();
78 
79     const std::string& HashInstance();
80   };
81 }
82