diff --git a/pystencils/interpolation_astnodes.py b/pystencils/interpolation_astnodes.py
index 28a3fc10c8a99d6dc750fb4296a41ed9de96b39c..50c4674051a9091792dc26c15d046d10c1dce58b 100644
--- a/pystencils/interpolation_astnodes.py
+++ b/pystencils/interpolation_astnodes.py
@@ -8,21 +8,25 @@
 
 """
 
+import hashlib
 import itertools
 from enum import Enum
 from typing import Set
 
-import pystencils
 import sympy as sp
+from sympy.core.cache import cacheit
+
+import pystencils
 from pystencils.astnodes import Node
 from pystencils.data_types import TypedSymbol, cast_func, create_type
-from sympy.core.cache import cacheit
 
 try:
     import pycuda.driver
 except Exception:
     pass
 
+_hash = hashlib.md5
+
 
 class InterpolationMode(str, Enum):
     NEAREST_NEIGHBOR = "nearest_neighbour"
@@ -85,6 +89,14 @@ class Interpolator(object):
         self.allow_textures = allow_textures
         self.interpolation_mode = interpolation_mode
 
+    @property
+    def _hashable_contents(self):
+        return (str(self.address_mode),
+                str(type(self)),
+                self.symbol,
+                self.address_mode,
+                self.use_normalized_coordinates)
+
     def at(self, offset):
         return InterpolatorAccess(self.symbol, *[sp.S(o) for o in offset])
 
@@ -92,17 +104,17 @@ class Interpolator(object):
         return InterpolatorAccess(self.symbol, *[sp.S(o) for o in offset])
 
     def __str__(self):
-        return '%s_interpolator' % self.field.name
+        return '%s_interpolator_%s' % (self.field.name, self.reproducible_hash)
 
     def __repr__(self):
         return self.__str__()
 
     def __hash__(self):
-        return hash((str(self.address_mode),
-                     str(type(self)),
-                     self.symbol,
-                     self.address_mode,
-                     self.use_normalized_coordinates))
+        return hash(self._hashable_contents)
+
+    @property
+    def reproducible_hash(self):
+        return _hash(str(self._hashable_contents).encode()).hexdigest()
 
 
 class LinearInterpolator(Interpolator):
@@ -327,18 +339,26 @@ class TextureCachedField:
         return TextureAccess(self.symbol, *offset)
 
     def __str__(self):
-        return '%s_texture_%x' % (self.field.name, abs(hash(self)))
+        return '%s_texture_%s' % (self.field.name, self.reproducible_hash)
 
     def __repr__(self):
         return self.__str__()
 
+    @property
+    def _hashable_contents(self):
+        return (type(self),
+                self.address_mode,
+                self.filter_mode,
+                self.read_as_integer,
+                self.interpolation_mode,
+                self.use_normalized_coordinates)
+
     def __hash__(self):
-        return hash((str(type(self)),
-                     self.address_mode,
-                     self.filter_mode,
-                     self.read_as_integer,
-                     self.interpolation_mode,
-                     self.use_normalized_coordinates))
+        return hash(self._hashable_contents)
+
+    @property
+    def reproducible_hash(self):
+        _hash(str(self._hashable_contents).encode()).hexdigest()
 
 
 class TextureAccess(InterpolatorAccess):