Arcane  v3.14.10.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 */
157 virtual Ref<IHashAlgorithmContext> createContext();
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.
Classe de base des vecteurs 1D de données.
Vue constante d'un tableau de type T.
Vue d'un tableau d'éléments de type T.
Definition Span.h:670
constexpr __host__ __device__ pointer data() const noexcept
Pointeur sur le début de la vue.
Definition Span.h:419
Vue d'un tableau d'éléments de type T.
Definition Span.h:510
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
unsigned char Byte
Type d'un octet.
Definition UtilsTypes.h:142