If we return a hash from sticky_entry then we'll need to also store the position in the list since stickies are ordered  - I guess either the list position is the key and the ditemid the value or vice versa - we probably would want to use ditemid as the key in order to enable this quick lookup, but then we would, I think, need to reverse the hash every time the order of the elements was actually important (to let us lookup by list position, or iterate over the stickies in order).  

As you say a fair bit of work in sticky_entries as well - the key will be reading the comma separated string from the user prop into a two hashes (for used and unused stickies) in an efficient fashion.  I'm guessing a map with a split would work, though I'm not sure what the efficiency implications would be - presumably the moment we use map over an array to get into a hash we've lost any gain we might have had by having the data stored as a hash.  Though I could be wrong about that since I must have thought it was worth doing with the map over @input in sticky_entry.

Broadly speaking I'm don't know enough about the efficiency of various perl operators (reverse, map, split) to know if this would actually yield a gain in efficiency.  If you think its worth doing I can give it a go.