You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

elsa.h 1.6KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. /*
  2. * Frozen
  3. * Copyright 2016 QuarksLab
  4. *
  5. * Licensed to the Apache Software Foundation (ASF) under one
  6. * or more contributor license agreements. See the NOTICE file
  7. * distributed with this work for additional information
  8. * regarding copyright ownership. The ASF licenses this file
  9. * to you under the Apache License, Version 2.0 (the
  10. * "License"); you may not use this file except in compliance
  11. * with the License. You may obtain a copy of the License at
  12. *
  13. * http://www.apache.org/licenses/LICENSE-2.0
  14. *
  15. * Unless required by applicable law or agreed to in writing,
  16. * software distributed under the License is distributed on an
  17. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  18. * KIND, either express or implied. See the License for the
  19. * specific language governing permissions and limitations
  20. * under the License.
  21. */
  22. #ifndef FROZEN_LETITGO_ELSA_H
  23. #define FROZEN_LETITGO_ELSA_H
  24. #include <type_traits>
  25. namespace frozen {
  26. template <class T> struct elsa {
  27. static_assert(std::is_integral<T>::value || std::is_enum<T>::value,
  28. "only supports integral types, specialize for other types");
  29. constexpr std::size_t operator()(T const &value, std::size_t seed) const {
  30. std::size_t key = seed ^ static_cast<std::size_t>(value);
  31. key = (~key) + (key << 21); // key = (key << 21) - key - 1;
  32. key = key ^ (key >> 24);
  33. key = (key + (key << 3)) + (key << 8); // key * 265
  34. key = key ^ (key >> 14);
  35. key = (key + (key << 2)) + (key << 4); // key * 21
  36. key = key ^ (key >> 28);
  37. key = key + (key << 31);
  38. return key;
  39. }
  40. };
  41. template <class T> using anna = elsa<T>;
  42. } // namespace frozen
  43. #endif