pdq/cpp/common/pdqhamming.h (34 lines of code) (raw):
// ================================================================
// Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
// ================================================================
#ifndef PDQHAMMING_H
#define PDQHAMMING_H
#include <pdq/cpp/common/pdqbasetypes.h>
// If your compiler doesn't support __builtin_popcount then feel free to
// undefine this. (Experiments have shown that using builtin popcount helps
// performance by a few percent -- worth using but OK to live without.)
#define USE_BUILTIN_POPCOUNT
namespace facebook {
namespace pdq {
namespace hashing {
#ifdef USE_BUILTIN_POPCOUNT
// Inlined right here
inline int hammingNorm8(Hash8 h) {
return __builtin_popcount((unsigned)h);
}
inline int hammingNorm16(Hash16 h) {
return __builtin_popcount((unsigned)h);
}
inline int hammingDistance8(Hash8 a, Hash8 b) {
return __builtin_popcount((unsigned)(a^b));
}
inline int hammingDistance16(Hash16 a, Hash16 b) {
return __builtin_popcount((unsigned)(a^b));
}
#else
// Implemented in pdqhamming.cpp with lookup tables.
int hammingNorm8(Hash8 h);
int hammingNorm16(Hash16 h);
int hammingDistance8(Hash8 a, Hash8 b);
int hammingDistance16(Hash16 a, Hash16 b);
#endif
// For regression/portability testing
int hammingNorm8Uncached(Hash8 h);
int hammingNorm16Uncached(Hash16 h);
int hammingNorm8Slow(Hash8 a);
int hammingNorm16Slow(Hash16 a);
} // namespace hashing
} // namespace pdq
} // namespace facebook
#endif // PDQHAMMING_H