As I wrote earlier, we aren't using noise function that can give random noise value directly for given coordinates, instead we are aggregating the noise each LOD level and using parent data to compute the children. It's faster that way as it caches the computation results of lower octaves and only performs interpolation and adding of a simple noise layer, and it allows for other things like post-processing the noise values. In that approach we are indeed using 2D face coordinates instead of 3D, but it can be both - the noise layer being added is just a normal noise, and you only have to find a good deterministic way of computing it.

I came up with the code listed above only after everybody presented the same direct function for computing the noise and complained about the precision. So I wondered why people aren't using an integer version that can use more bits for computation. However, my version uses 2D coordinates as the input, I can see it would be simpler for people to use 3D there. Well, it should work as you have described.

Note that I haven't actually tried the code yet, so there may be other issues I could not foresee, but generally it should work.