PyObject.GetHashCode overflow bug

PyObject.GetHashCode() can throw an OverflowException because IntPtr.ToInt32() does throw. See

return Runtime.PyObject_Hash(obj).ToInt32();

. I suggest fixing this by xoring the high and low parts of that IntPtr together. Like this:

var ulongVal = (ulong)ptr;
return (int)((uint)ulongVal ^ (uint)(ulongVal >> 32));

This happened to me when inserting into a dictionary using tensorflow objects as keys:

new Dictionary<dynamic, dynamic>() { { x, 1.0 }, { y, 1.0 }, }

Environment

  • Pythonnet version: 2.3
  • Python version: 3.5
  • Operating System: Windows 7