The issue isn't necessarily the hashing but the fact that you need to have this globally synced instead of e.g. creating a thread-local string pool.
Well. Yes, but as long as we do not have actual threads that can run concurrently in pike this is not much of an issue, really.
C-code can (and does) work with non-shared strings, and it is only when the data is moved to the pike layer that it needs to be shared.
This is done without locks since we have the "nice" global interpreter lock, and the fact that there is only one shared string pool is thus not really all that important.