Improve the sampling routine cache key hash

On 64-bit platforms more collisions can be prevented by spreading
the three 32-bit values more widely apart.

Bug: b/137649247
Change-Id: Icf429b4fc5a3d5d4472b346b190e48ac429bf881
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/34929
Presubmit-Ready: Nicolas Capens <nicolascapens@google.com>
Reviewed-by: Ben Clayton <bclayton@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Nicolas Capens <nicolascapens@google.com>
diff --git a/src/Vulkan/VkDevice.hpp b/src/Vulkan/VkDevice.hpp
index ae7c21f..809ef2f 100644
--- a/src/Vulkan/VkDevice.hpp
+++ b/src/Vulkan/VkDevice.hpp
@@ -122,10 +122,12 @@
 
 inline std::size_t vk::Device::SamplingRoutineCache::Key::Hash::operator() (const Key& key) const noexcept
 {
-	auto hash = key.instruction;
-	hash = (hash * 31) ^ key.sampler;
-	hash = (hash * 31) ^ key.imageView;
-	return hash;
+	// Combine three 32-bit integers into a 64-bit hash.
+	// 2642239 is the largest prime which when cubed is smaller than 2^64.
+	uint64_t hash = key.instruction;
+	hash = (hash * 2642239) ^ key.sampler;
+	hash = (hash * 2642239) ^ key.imageView;
+	return static_cast<std::size_t>(hash);  // Truncates to 32-bits on 32-bit platforms.
 }
 
 } // namespace vk