#include <chrono>
#include <iostream>
#include <vector>
template <class T>
inline void hash_combine(std::size_t& seed, T const& v)
{
seed ^= std::hash<T>()(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
namespace std
{
template<typename T>
struct hash { };
template<typename T>
struct hash<std::vector<T>>
{
typedef std::vector<T> argument_type;
typedef std::size_t result_type;
result_type operator()(argument_type const& in) const
{
size_t size = in.size();
result_type seed = 0;
for (size_t i = 0; i < size; i++)
//Combine the hash of the current vector with the hashes of the previous ones
hash_combine(seed, in[i]);
return seed;
}
};
}
int main() {
std::vector<double> arr(1000*1000*10);
auto start = std::chrono::high_resolution_clock::now();
size_t hash = std::hash<std::vector<double>>()(arr);
auto stop = std::chrono::high_resolution_clock::now();
std::cout << "hash of " << arr.size() << " doubles took ";
std::cout << std::chrono::duration_cast<std::chrono::microseconds>(stop - start).count();
std::cout << " us and resulted in hash: " << hash << std::endl;
return 0;
}
I2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKCnRlbXBsYXRlIDxjbGFzcyBUPgppbmxpbmUgdm9pZCBoYXNoX2NvbWJpbmUoc3RkOjpzaXplX3QmIHNlZWQsIFQgY29uc3QmIHYpCnsKICAgIHNlZWQgXj0gc3RkOjpoYXNoPFQ+KCkodikgKyAweDllMzc3OWI5ICsgKHNlZWQgPDwgNikgKyAoc2VlZCA+PiAyKTsKfQoKbmFtZXNwYWNlIHN0ZAp7Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoJc3RydWN0IGhhc2ggeyB9OwogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIHN0cnVjdCBoYXNoPHN0ZDo6dmVjdG9yPFQ+PgogICAgewogICAgICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VD4gYXJndW1lbnRfdHlwZTsKICAgICAgICB0eXBlZGVmIHN0ZDo6c2l6ZV90IHJlc3VsdF90eXBlOwogICAgICAgIHJlc3VsdF90eXBlIG9wZXJhdG9yKCkoYXJndW1lbnRfdHlwZSBjb25zdCYgaW4pIGNvbnN0CiAgICAgICAgewogICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGluLnNpemUoKTsKICAgICAgICAgICAgcmVzdWx0X3R5cGUgc2VlZCA9IDA7CiAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQogICAgICAgICAgICAgICAgLy9Db21iaW5lIHRoZSBoYXNoIG9mIHRoZSBjdXJyZW50IHZlY3RvciB3aXRoIHRoZSBoYXNoZXMgb2YgdGhlIHByZXZpb3VzIG9uZXMKICAgICAgICAgICAgICAgIGhhc2hfY29tYmluZShzZWVkLCBpbltpXSk7CiAgICAgICAgICAgIHJldHVybiBzZWVkOwogICAgICAgIH0KICAgIH07Cn0KCmludCBtYWluKCkgewoJc3RkOjp2ZWN0b3I8ZG91YmxlPiBhcnIoMTAwMCoxMDAwKjEwKTsKCWF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKCXNpemVfdCBoYXNoID0gc3RkOjpoYXNoPHN0ZDo6dmVjdG9yPGRvdWJsZT4+KCkoYXJyKTsKCWF1dG8gc3RvcCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwoJc3RkOjpjb3V0IDw8ICJoYXNoIG9mICIgPDwgYXJyLnNpemUoKSA8PCAiIGRvdWJsZXMgdG9vayAiOwoJc3RkOjpjb3V0IDw8IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KHN0b3AgLSBzdGFydCkuY291bnQoKTsKCXN0ZDo6Y291dCA8PCAiIHVzIGFuZCByZXN1bHRlZCBpbiBoYXNoOiAiIDw8IGhhc2ggPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0=