Source

hashCode53.js

/** 对传入字符串进行 hash 计算,哈希值范围为 JS 可表示的安全值范围 ±9E15
 * @category Encoding
 * @param {String} str 传入字符串
 * @returns {Number} 传入字符串的哈希值
 * @function hashCode53
 * 
 * @example
 * hashCode53('hello world') //=> -5975507814869267
 */
export default function hashCode53(str) {
  var max53 = 9007199254740992;
  var min53 = -9007199254740992;
  var factor = 31;
  var hash = 0;
  if (str.length > 0) {
    var val = str.split('');
    for (var i = 0; i < val.length; i++) {
      var aVal = val[i].charCodeAt();
      var nextHash = factor * hash + aVal;
      if (nextHash > max53) {
        hash = min53 + hash;
        while (((nextHash = factor * hash + aVal), nextHash < min53)) {
          hash = hash / 2 + aVal;
        }
      }
      if (nextHash < min53) {
        hash = max53 + hash;
        while (((nextHash = factor * hash + aVal), nextHash > max53)) {
          hash = hash / 2 + aVal;
        }
      }
      hash = factor * hash + aVal;
    }
  }
  return hash;
}