UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
IoHash.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
8#include "HAL/Platform.h"
10#include "HAL/UnrealMemory.h"
11#include "Hash/Blake3.h"
12#include "Memory/MemoryFwd.h"
13#include "Memory/MemoryView.h"
16#include "String/BytesToHex.h"
17#include "String/HexToBytes.h"
18
20template <typename CharType> class TStringBuilderBase;
21
32struct FIoHash
33{
34public:
35 using ByteArray = uint8[20];
36
38 constexpr FIoHash() = default;
39
41 inline explicit FIoHash(const ByteArray& Hash);
42
44 inline FIoHash(const FBlake3Hash& Hash);
45
47 inline explicit FIoHash(FAnsiStringView HexHash);
48 inline explicit FIoHash(FWideStringView HexHash);
49 inline explicit FIoHash(FUtf8StringView HexHash);
50
52 inline static FIoHash FromView(FMemoryView Hash);
53
55 inline void Reset() { *this = FIoHash(); }
56
58 inline bool IsZero() const;
59
61 inline ByteArray& GetBytes() { return Hash; }
62 inline const ByteArray& GetBytes() const { return Hash; }
63
65 [[nodiscard]] static inline FIoHash HashBuffer(FMemoryView View);
66 [[nodiscard]] static inline FIoHash HashBuffer(const void* Data, uint64 Size);
67 [[nodiscard]] static inline FIoHash HashBuffer(const FCompositeBuffer& Buffer);
68
70 static const FIoHash Zero;
71
72private:
73 alignas(uint32) ByteArray Hash{};
74
75 friend inline bool operator==(const FIoHash& A, const FIoHash& B)
76 {
77 return FMemory::Memcmp(A.GetBytes(), B.GetBytes(), sizeof(decltype(A.GetBytes()))) == 0;
78 }
79
80 friend inline bool operator!=(const FIoHash& A, const FIoHash& B)
81 {
82 return FMemory::Memcmp(A.GetBytes(), B.GetBytes(), sizeof(decltype(A.GetBytes()))) != 0;
83 }
84
85 friend inline bool operator<(const FIoHash& A, const FIoHash& B)
86 {
87 return FMemory::Memcmp(A.GetBytes(), B.GetBytes(), sizeof(decltype(A.GetBytes()))) < 0;
88 }
89
90 friend inline uint32 GetTypeHash(const FIoHash& Value)
91 {
92 return *reinterpret_cast<const uint32*>(Value.GetBytes());
93 }
94
96 {
97 Ar.Serialize(InHash.GetBytes(), sizeof(decltype(InHash.GetBytes())));
98 return Ar;
99 }
100};
101
102inline const FIoHash FIoHash::Zero;
103
105{
106 FMemory::Memcpy(Hash, InHash, sizeof(ByteArray));
107}
108
110{
111 static_assert(sizeof(ByteArray) <= sizeof(decltype(InHash.GetBytes())), "Reading too many bytes from source.");
112 FMemory::Memcpy(Hash, InHash.GetBytes(), sizeof(ByteArray));
113}
114
116{
117 check(HexHash.Len() == sizeof(ByteArray) * 2);
119}
120
122{
123 check(HexHash.Len() == sizeof(ByteArray) * 2);
125}
126
128{
129 check(HexHash.Len() == sizeof(ByteArray) * 2);
131}
132
134{
135 checkf(InHash.GetSize() == sizeof(ByteArray),
136 TEXT("FIoHash cannot be constructed from a view of %" UINT64_FMT " bytes."), InHash.GetSize());
138 FMemory::Memcpy(NewHash.Hash, InHash.GetData(), sizeof(ByteArray));
139 return NewHash;
140}
141
142inline bool FIoHash::IsZero() const
143{
144 using UInt32Array = uint32[5];
145 static_assert(sizeof(UInt32Array) == sizeof(ByteArray), "Invalid size for UInt32Array");
146 for (uint32 Value : reinterpret_cast<const UInt32Array&>(Hash))
147 {
148 if (Value != 0)
149 {
150 return false;
151 }
152 }
153 return true;
154}
155
157{
158 return FBlake3::HashBuffer(View);
159}
160
161inline FIoHash FIoHash::HashBuffer(const void* Data, uint64 Size)
162{
163 return FBlake3::HashBuffer(Data, Size);
164}
165
170
171template <typename CharType>
173{
174 UE::String::BytesToHexLower(Hash.GetBytes(), Builder);
175 return Builder;
176}
177
180{
182}
183
185[[nodiscard]] CORE_API FString LexToString(const FIoHash& Hash);
186
188
191{
192public:
198 [[nodiscard]] inline FIoHash Finalize() const { return FBlake3::Finalize(); }
199
201 [[nodiscard]] inline static FIoHash HashBuffer(FMemoryView View) { return FBlake3::HashBuffer(View); }
202 [[nodiscard]] inline static FIoHash HashBuffer(const void* Data, uint64 Size) { return FBlake3::HashBuffer(Data, Size); }
204};
#define UINT64_FMT
Definition AndroidPlatformString.h:66
#define check(expr)
Definition AssertionMacros.h:314
#define checkf(expr, format,...)
Definition AssertionMacros.h:315
#define TEXT(x)
Definition Platform.h:1272
FPlatformTypes::TCHAR TCHAR
Either ANSICHAR or WIDECHAR, depending on whether the platform supports wide characters or the requir...
Definition Platform.h:1135
FPlatformTypes::uint64 uint64
A 64-bit unsigned integer.
Definition Platform.h:1117
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
void LexFromString(FIoHash &OutHash, const TCHAR *Buffer)
Definition IoHash.h:179
CORE_API FString LexToString(const FIoHash &Hash)
Definition IoHash.cpp:8
TStringBuilderBase< CharType > & operator<<(TStringBuilderBase< CharType > &Builder, const FIoHash &Hash)
Definition IoHash.h:172
uint32 Size
Definition VulkanMemory.cpp:4034
uint8_t uint8
Definition binka_ue_file_header.h:8
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition Archive.h:1208
virtual void Serialize(void *V, int64 Length)
Definition Archive.h:1689
Definition Blake3.h:94
CORE_API FBlake3Hash Finalize() const
Definition Blake3.cpp:65
static CORE_API FBlake3Hash HashBuffer(FMemoryView View)
Definition Blake3.cpp:78
Definition CompositeBuffer.h:27
Definition IoHash.h:191
static FIoHash HashBuffer(const void *Data, uint64 Size)
Definition IoHash.h:202
FIoHash Finalize() const
Definition IoHash.h:198
static FIoHash HashBuffer(FMemoryView View)
Definition IoHash.h:201
static FIoHash HashBuffer(const FCompositeBuffer &Buffer)
Definition IoHash.h:203
Definition StringBuilder.h:79
void BytesToHexLower(TConstArrayView< uint8 > Bytes, ANSICHAR *OutHex)
Definition BytesToHex.cpp:42
int32 HexToBytes(FWideStringView Hex, uint8 *OutBytes)
Definition HexToBytes.cpp:30
Definition Blake3.h:27
Definition IoHash.h:33
ByteArray & GetBytes()
Definition IoHash.h:61
void Reset()
Definition IoHash.h:55
bool IsZero() const
Definition IoHash.h:142
friend FArchive & operator<<(FArchive &Ar, FIoHash &InHash)
Definition IoHash.h:95
friend bool operator<(const FIoHash &A, const FIoHash &B)
Definition IoHash.h:85
constexpr FIoHash()=default
const ByteArray & GetBytes() const
Definition IoHash.h:62
static FIoHash HashBuffer(FMemoryView View)
Definition IoHash.h:156
static const FIoHash Zero
Definition IoHash.h:70
friend bool operator==(const FIoHash &A, const FIoHash &B)
Definition IoHash.h:75
friend bool operator!=(const FIoHash &A, const FIoHash &B)
Definition IoHash.h:80
uint8[20] ByteArray
Definition IoHash.h:35
static FIoHash FromView(FMemoryView Hash)
Definition IoHash.h:133
friend uint32 GetTypeHash(const FIoHash &Value)
Definition IoHash.h:90
static UE_FORCEINLINE_HINT int32 Memcmp(const void *Buf1, const void *Buf2, SIZE_T Count)
Definition UnrealMemory.h:114
static UE_FORCEINLINE_HINT void * Memcpy(void *Dest, const void *Src, SIZE_T Count)
Definition UnrealMemory.h:160