No, I'm fairly confident that g_hash_table correctly uses the provided equals functions if collisions do occur.

I suspect either the Ubuntu guest really does map those 2 addresses to the same physical page, or there is a more subtle bug elsewhere in your code that is silently casting a 64-bit value to a 32-bit value.  This has happened to us frequently when having functions that return addr_t, but forgetting to declare them or include their header and having the return value treated as an int.