blob: deca56cba0b9644196972c39859354ae427ceedc [file] [log] [blame]
 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. part of dart.math; /// This is the [Jenkins hash function][1] but using masking to keep /// values in SMI range. /// /// [1]: http://en.wikipedia.org/wiki/Jenkins_hash_function /// /// Use: /// Hash each value with the hash of the previous value, then get the final /// hash by calling finish. /// /// var hash = 0; /// for (var value in values) { /// hash = JenkinsSmiHash.combine(hash, value.hashCode); /// } /// hash = JenkinsSmiHash.finish(hash); class _JenkinsSmiHash { // TODO(11617): This class should be optimized and standardized elsewhere. static int combine(int hash, int value) { hash = 0x1fffffff & (hash + value); hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); return hash ^ (hash >> 6); } static int finish(int hash) { hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); hash = hash ^ (hash >> 11); return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); } static int hash2(int a, int b) => finish(combine(combine(0, a), b)); static int hash4(int a, int b, int c, int d) => finish(combine(combine(combine(combine(0, a), b), c), d)); }