aboutsummaryrefslogtreecommitdiff
path: root/src/zencore/xxhash.cpp
blob: 6d1050531ad054375d4a13c5a882201d58bc4c4b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
// Copyright Epic Games, Inc. All Rights Reserved.

#include <zencore/xxhash.h>

#include <zencore/string.h>
#include <zencore/testing.h>

#include <gsl/gsl-lite.hpp>

namespace zen {

XXH3_128 XXH3_128::Zero;  // Initialized to all zeros

XXH3_128
XXH3_128::FromHexString(const char* InString)
{
	return FromHexString({InString, sizeof(XXH3_128::Hash) * 2});
}

XXH3_128
XXH3_128::FromHexString(std::string_view InString)
{
	ZEN_ASSERT(InString.size() == 2 * sizeof(XXH3_128::Hash));

	XXH3_128 Xx;
	ParseHexBytes(InString.data(), InString.size(), Xx.Hash);
	return Xx;
}

const char*
XXH3_128::ToHexString(char* OutString /* 40 characters + NUL terminator */) const
{
	ToHexBytes(Hash, sizeof(XXH3_128), OutString);
	OutString[2 * sizeof(XXH3_128)] = '\0';

	return OutString;
}

StringBuilderBase&
XXH3_128::ToHexString(StringBuilderBase& OutBuilder) const
{
	String_t str;
	ToHexString(str);

	OutBuilder.AppendRange(str, &str[StringLength]);

	return OutBuilder;
}

//////////////////////////////////////////////////////////////////////////
//
// Unit tests
//

#if ZEN_WITH_TESTS

void
xxhash_forcelink()
{
}

TEST_CASE("XXH3_128")
{
	using namespace std::literals;

	const std::string_view ShortString{"1234"};
	const std::string_view LongString{
		"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
		"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
		"1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"};

	SUBCASE("short_deprecated")
	{
		XXH3_128Stream_deprecated x;
		x.Append(ShortString.data(), ShortString.size());
		const XXH3_128 Hash = x.GetHash();
		CHECK(Hash == XXH3_128::FromHexString("0d44dd7fde8ea2b4ba961e1a26f71f21"sv));
	}

	SUBCASE("short")
	{
		XXH3_128Stream x;
		x.Append(ShortString.data(), ShortString.size());
		const XXH3_128 Hash = x.GetHash();
		CHECK(Hash == XXH3_128::FromHexString("9a4dea864648af82823c8c03e6dd2202"sv));
		CHECK(Hash == XXH3_128::HashMemory(ShortString.data(), ShortString.size()));
	}

	SUBCASE("long")
	{
		XXH3_128Stream x;
		x.Append(LongString.data(), LongString.size());
		const XXH3_128 Hash = x.GetHash();
		CHECK(Hash == XXH3_128::FromHexString("fbd5e72f7a5894590d1ef49dfcc58b7d"sv));
		CHECK(Hash == XXH3_128::HashMemory(LongString.data(), LongString.size()));
	}
}

#endif

}  // namespace zen