Arcane  v3.16.0.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
IHashAlgorithm.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2023 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* IHashAlgorithm.h (C) 2000-2023 */
9/* */
10/* Interface d'un algorithme de hashage. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_IHASHALGORITHM_H
13#define ARCANE_UTILS_IHASHALGORITHM_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
18
19#include "arccore/base/Span.h"
21
22/*---------------------------------------------------------------------------*/
23/*---------------------------------------------------------------------------*/
24
25namespace Arcane
26{
27
28/*---------------------------------------------------------------------------*/
29/*---------------------------------------------------------------------------*/
30/*!
31 * \brief Valeur retournée par un algorithme de hashage.
32 */
33class ARCANE_UTILS_EXPORT HashAlgorithmValue
34{
35 public:
36
37 static constexpr Int32 MAX_SIZE = 64;
38
39 public:
40
42 {
43 return { m_value.data(), m_size };
44 }
45 SmallSpan<const std::byte> bytes() const
46 {
47 return { m_value.data(), m_size };
48 }
49 SmallSpan<const Byte> asLegacyBytes() const
50 {
51 return { reinterpret_cast<const Byte*>(m_value.data()), m_size };
52 }
53 void setSize(Int32 size);
54
55 private:
56
57 std::array<std::byte, MAX_SIZE> m_value = {};
58 Int32 m_size = MAX_SIZE;
59};
60
61/*---------------------------------------------------------------------------*/
62/*---------------------------------------------------------------------------*/
63/*!
64 * \brief Contexte pour calculer un hash de manière incrémentale.
65 *
66 * On peut utiliser un même contexte plusieurs fois en appelant reset() pour
67 * réinitialiser l'instance.
68 *
69 * \code
70 * IHashAlgorithm* algo = ...;
71 * HashAlgorithmValue hash_value;
72 * hash_value.reserve(algo->hashSize());
73 * UniqueArray<std::byte> array1 = ...;
74 * UniqueArray<std::byte> array2 = ...;
75 *
76 * Ref<IHashContext> context = algo->createContext();
77 * context->updateHash(array1);
78 * context->updateHash(array2);
79 * context->computeHashValue(hash_value);
80 * \endcode
81 */
82class ARCANE_UTILS_EXPORT IHashAlgorithmContext
83{
84 public:
85
86 virtual ~IHashAlgorithmContext() = default;
87
88 public:
89
90 //! Réinitialise l'instance pour calculer une nouvelle valeur de hash.
91 virtual void reset() = 0;
92
93 //! Ajoute le tableau \a input au hash calculé
94 virtual void updateHash(Span<const std::byte> input) = 0;
95
96 //! Calcule la valeur de hashage et la retourne dans hash_value.
97 virtual void computeHashValue(HashAlgorithmValue& hash_value) = 0;
98};
99
100/*---------------------------------------------------------------------------*/
101/*---------------------------------------------------------------------------*/
102/*!
103 * \brief Interface d'un algorithme de hashage.
104 */
105class ARCANE_UTILS_EXPORT IHashAlgorithm
106{
107 public:
108
109 virtual ~IHashAlgorithm() = default;
110
111 public:
112
113 //NOTE: pour l'instant (version 3.10) par encore virtuel pure pour rester
114 // compatible avec l'existant
115 //! Nom de l'algorithme
116 virtual String name() const;
117
118 //NOTE: pour l'instant (version 3.10) par encore virtuel pure pour rester
119 // compatible avec l'existant. Envoi FatalErrorException si pas surchargée
120 //! Taille (en octet) de la clé de hash.
121 virtual Int32 hashSize() const;
122
123 /*!
124 * \brief Calcule la valeur du hash pour le tableau \a input.
125 *
126 * La valeur de hashage est <strong>ajoutée</string> dans \a output.
127 * La longueur ajoutée est égale à hashSize().
128 */
129 virtual void computeHash64(Span<const Byte> input, ByteArray& output);
130
131 /*!
132 * \brief Calcule la valeur du hash pour le tableau \a input.
133 *
134 * La valeur de hashage est <strong>ajoutée</string> dans \a output.
135 * La longueur ajoutée est égale à hashSize().
136 */
137 virtual void computeHash64(Span<const std::byte> input, ByteArray& output);
138
139 //NOTE: pour l'instant (version 3.11) par encore virtuel pure pour rester
140 // compatible avec l'existant
141 /*!
142 * \brief Calcule la valeur du hash pour le tableau \a input.
143 *
144 * La valeur de hashage est positionnée dans \a value
145 */
146 virtual void computeHash(Span<const std::byte> input, HashAlgorithmValue& value);
147
148 //NOTE: pour l'instant (version 3.11) par encore virtuel pure pour rester
149 // compatible avec l'existant
150 /*!
151 * \brief Créé un contexte pour calculer la valeur du hash
152 * de manière incrémentale.
153 *
154 * Si l'implémentation ne supporte pas le mode incrémental (hasCreateContext()==false),
155 * une exception est levée.
156 */
158
159 //NOTE: pour l'instant (version 3.11) par encore virtuel pure pour rester
160 // compatible avec l'existant
161 //! Indique si l'implémentation supporte un hash incrémental
162 virtual bool hasCreateContext() const { return false; }
163
164 public:
165
166 /*!
167 * \brief Calcule la valeur du hash pour le tableau \a input.
168 *
169 * La valeur de hashage est <strong>ajoutée</string> dans \a output.
170 * La longueur dépend de l'algorithme utilisé.
171 */
172 ARCANE_DEPRECATED_REASON("Y2023: Use computeHash64(Span<const std::byte> input,ByteArray& output) instead")
173 virtual void computeHash(ByteConstArrayView input, ByteArray& output) = 0;
174};
175
176/*---------------------------------------------------------------------------*/
177/*---------------------------------------------------------------------------*/
178
179} // namespace Arcane
180
181/*---------------------------------------------------------------------------*/
182/*---------------------------------------------------------------------------*/
183
184#endif
185
Déclarations des types utilisés dans Arcane.
Valeur retournée par un algorithme de hashage.
Contexte pour calculer un hash de manière incrémentale.
virtual void updateHash(Span< const std::byte > input)=0
Ajoute le tableau input au hash calculé
virtual void reset()=0
Réinitialise l'instance pour calculer une nouvelle valeur de hash.
virtual void computeHashValue(HashAlgorithmValue &hash_value)=0
Calcule la valeur de hashage et la retourne dans hash_value.
Interface d'un algorithme de hashage.
virtual bool hasCreateContext() const
Indique si l'implémentation supporte un hash incrémental.
virtual String name() const
Nom de l'algorithme.
virtual void computeHash(Span< const std::byte > input, HashAlgorithmValue &value)
Calcule la valeur du hash pour le tableau input.
virtual void computeHash64(Span< const Byte > input, ByteArray &output)
Calcule la valeur du hash pour le tableau input.
virtual Int32 hashSize() const
Taille (en octet) de la clé de hash.
virtual Ref< IHashAlgorithmContext > createContext()
Créé un contexte pour calculer la valeur du hash de manière incrémentale.
Référence à une instance.
Vue d'un tableau d'éléments de type T.
Definition Span.h:673
Vue d'un tableau d'éléments de type T.
Definition Span.h:513
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Array< Byte > ByteArray
Tableau dynamique à une dimension de caractères.
Definition UtilsTypes.h:208
ConstArrayView< Byte > ByteConstArrayView
Equivalent C d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:563
unsigned char Byte
Type d'un octet.
Definition BaseTypes.h:43
std::int32_t Int32
Type entier signé sur 32 bits.