【问题标题】:Convert strings to 16Bit UTF integers in Javascript在 Javascript 中将字符串转换为 16 位 UTF 整数
【发布时间】:2022-01-03 07:55:12
【问题描述】:

我正在使用 firebase firestore,出于某种原因,我需要将每个新用户文档 ID 散列为整数,特别是 16Bit UTF 整数。主要是尝试在 Dart 中复制 .hashcode 方法。

我发现并尝试过的是这个

// Convert to 32bit integer
const hashFunction = (string) => {
  var hash = 0;
  if (string.length == 0) return hash;

  for (i = 0; i < string.length; i++) {
    char = string.charCodeAt(i);
    hash = (hash << 5) - hash + char;
    hash = hash & hash;
  }
  return hash >>> 0;   // returns hash as positive integer
};

但这只能转换为 32 位 int。感谢您提供任何和所有帮助。

EDIT1:使用@selbie 的更改我取得了一些进展,但我得到的哈希与 Dart 中的 .hashCode 方法完全不同

反正我能得到同样的结果吗

【问题讨论】:

  • "我需要将每个新的用户文档 ID 散列为整数" - 你认为为什么需要这样做?你为什么要做这个客户端?
  • 变量hash 应该是什么数据类型?整数16?整数32? uint32? uint16?还有什么?
  • @Dai 实际上我是通过服务器上的云功能来实现的
  • @Thomas uint16 我认为
  • 2328644 不是 16 位值。那至少是22位。您从哪里获得hashFunction 的源代码?我无法在 dart 存储库中找到该函数。

标签: javascript hash hashcode utf-16 16-bit


【解决方案1】:

如果你只想要一个 16 位的哈希,那么:

而不是这个:

return hash >>> 0;   // returns hash as positive integer

这个:

return hash & 0xffff; // return lower 16-bits of hash value

这一行:

if (string.length == 0) return hash;

不需要,因为如果 string.length 为 0,您的 for 循环将根本不会运行。

最后,变量名与类型相同并不是一个好主意。所以让我们将string 重命名为s

这是一个简化的解决方案:

const hashFunction = (s) => {
  var hash = 0;

  for (i = 0; i < s.length; i++) {
    hash = (hash << 5) - hash + s.charCodeAt(i);
    hash = hash & hash; // prevent overflow from happening
  }
  return hash & 0xffff;   // returns lower 16-bit of hash value
};

考虑到这一点,16 位散列并不是很强的散列。在对几千个字符串进行哈希处理后肯定会发生冲突。酌情考虑使用加密强度高的散列或更大的散列宽度。

【讨论】:

  • return hash &amp; 0xffff 取决于,这基本上返回一个 uint16。如果你想要一个(签名的)int16,那就是return (hash&lt;&lt;16)&gt;&gt;16;
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2010-09-21
  • 2014-02-05
  • 1970-01-01
相关资源
最近更新 更多