UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
CityHash.h
Go to the documentation of this file.
1// Copyright (c) 2011 Google, Inc.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a copy
4// of this software and associated documentation files (the "Software"), to deal
5// in the Software without restriction, including without limitation the rights
6// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7// copies of the Software, and to permit persons to whom the Software is
8// furnished to do so, subject to the following conditions:
9//
10// The above copyright notice and this permission notice shall be included in
11// all copies or substantial portions of the Software.
12//
13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19// THE SOFTWARE.
20//
21// CityHash, by Geoff Pike and Jyrki Alakuijala
22//
23// http://code.google.com/p/cityhash/
24//
25// This file provides a few functions for hashing strings. All of them are
26// high-quality functions in the sense that they pass standard tests such
27// as Austin Appleby's SMHasher. They are also fast.
28//
29// For 64-bit x86 code, on short strings, we don't know of anything faster than
30// CityHash64 that is of comparable quality. We believe our nearest competitor
31// is Murmur3. For 64-bit x86 code, CityHash64 is an excellent choice for hash
32// tables and most other hashing (excluding cryptography).
33//
34// For 64-bit x86 code, on long strings, the picture is more complicated.
35// On many recent Intel CPUs, such as Nehalem, Westmere, Sandy Bridge, etc.,
36// CityHashCrc128 appears to be faster than all competitors of comparable
37// quality. CityHash128 is also good but not quite as fast. We believe our
38// nearest competitor is Bob Jenkins' Spooky. We don't have great data for
39// other 64-bit CPUs, but for long strings we know that Spooky is slightly
40// faster than CityHash on some relatively recent AMD x86-64 CPUs, for example.
41// Note that CityHashCrc128 is declared in citycrc.h.
42//
43// For 32-bit x86 code, we don't know of anything faster than CityHash32 that
44// is of comparable quality. We believe our nearest competitor is Murmur3A.
45// (On 64-bit CPUs, it is typically faster to use the other CityHash variants.)
46//
47// Functions in the CityHash family are not suitable for cryptography.
48//
49// Please see CityHash's README file for more details on our performance
50// measurements and so on.
51//
52// WARNING: This code has been only lightly tested on big-endian platforms!
53// It is known to work well on little-endian platforms that have a small penalty
54// for unaligned reads, such as current Intel and AMD moderate-to-high-end CPUs.
55// It should work on all 32-bit and 64-bit platforms that allow unaligned reads;
56// bug reports are welcome.
57//
58// By the way, for some hash functions, given strings a and b, the hash
59// of a+b is easily derived from the hashes of a and b. This property
60// doesn't hold for any hash functions in this file.
61
62#ifndef CITY_HASH_H_
63#define CITY_HASH_H_
64
65#include "CoreTypes.h"
66
73
74// Hash function for a byte array.
75// NOTE: provided for compatibility, newer code should prefer XXHash.
76CORE_API uint64 CityHash64(const char *buf, uint32 len);
77
78// Hash function for a byte array. For convenience, a 64-bit seed is also
79// hashed into the result.
80// NOTE: provided for compatibility, newer code should prefer XXHash.
82
83// Hash function for a byte array. For convenience, two seeds are also
84// hashed into the result.
85// NOTE: provided for compatibility, newer code should prefer XXHash.
88
89// Hash function for a byte array. Most useful in 32-bit binaries.
90// NOTE: provided for compatibility, newer code should prefer XXHash.
91CORE_API uint32 CityHash32(const char *buf, uint32 len);
92
93// Hash 128 input bits down to 64 bits of output.
94// This is intended to be a reasonably good hash function.
96 // Murmur-inspired hashing.
97 const uint64 kMul = 0x9ddfea08eb382d69ULL;
98 uint64 a = (x.lo ^ x.hi) * kMul;
99 a ^= (a >> 47);
100 uint64 b = (x.hi ^ a) * kMul;
101 b ^= (b >> 47);
102 b *= kMul;
103 return b;
104}
105
106#endif // CITY_HASH_H_
uint64 CityHash128to64(const Uint128_64 &x)
Definition CityHash.h:95
CORE_API uint64 CityHash64WithSeeds(const char *buf, uint32 len, uint64 seed0, uint64 seed1)
Definition CityHash.cpp:436
CORE_API uint32 CityHash32(const char *buf, uint32 len)
Definition CityHash.cpp:203
CORE_API uint64 CityHash64(const char *buf, uint32 len)
Definition CityHash.cpp:388
CORE_API uint64 CityHash64WithSeed(const char *buf, uint32 len, uint64 seed)
Definition CityHash.cpp:430
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
uint32_t uint32
Definition binka_ue_file_header.h:6
Definition CityHash.h:68
uint64 hi
Definition CityHash.h:71
Uint128_64(uint64 InLo, uint64 InHi)
Definition CityHash.h:69
uint64 lo
Definition CityHash.h:70