I think there are few other ways but they would not be very efficient.
1) Let us take the example given, first_array = {4, 5, 1, 4, 6, 6, 9, 2}, , and second_array = {1, 4, 4, 9, 2, 6, 6, 5}. A number, in general, can be factored into its primes, so, if we consider each element of an array to be denoting nth prime, n being an element in array, and then computing its product. If products from both arrays are same, then they would be similar
So, as per example, for first_array, 4th prime * 5th prime * 1st prime * 4th prime * 6th prime * 6th prime * 9th prime * 2nd prime. Similarly, for second_array. So, product would be same, but with large data sets, it would overflow (it becomes a different problem then).
2) We could also consider first_array and second_array to be permutations of each other. In such a case, we could start with a smaller array (which in this case would be second_array because it is 14492665 which is lesser than first_array, i.e, 45146692), and then start computing next permutation(in C++, std::next_permutation). If first_array is not achieved from second_array, then they are not similar.
But with Narendra's solution with the following criteria :
1) Number of elements in both arrays
2) first_array ^ second_array == 0
3) sum(first_array) == sum(second_array)
Are there cases where it would fail?