You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求实现忽略拼接顺序的字符串哈希方法

实现忽略拼接顺序的字符串哈希方法

要让str1+str2和str2+str1的哈希值相等,核心是让哈希结果不受字符串拼接顺序的影响,下面是两种实用方案:

方案1:单独哈希后做交换律运算(推荐)

先给每个字符串单独计算哈希,再用满足交换律的运算(比如加法、异或)把两个哈希值组合起来——交换律意味着hashA + hashB和hashB + hashA结果完全一致,自然就忽略了拼接顺序。

代码示例:

// 基础字符串哈希函数(多项式哈希,避免溢出)
function basicHash(str) {
  let hash = 0;
  const MOD = 1000000007;
  for (const char of str) {
    hash = (hash * 31 + char.charCodeAt(0)) % MOD;
  }
  return hash;
}

// 忽略拼接顺序的哈希函数
function commutativeHash(strA, strB) {
  const hashA = basicHash(strA);
  const hashB = basicHash(strB);
  // 可选:加法取模、异或、max+min组合,任选一种都满足需求
  return (hashA + hashB) % 1000000007;
  // return hashA ^ hashB;
  // return (Math.max(hashA, hashB) * 1000000007 + Math.min(hashA, hashB)) % 1000000007;
}

// 测试验证
const str1 = "abc";
const str2 = "zyx";
const hash1 = commutativeHash(str1, str2);
const hash2 = commutativeHash(str2, str1);
console.log(hash1 === hash2); // 输出 true

这种方式计算高效,还能避免拼接长字符串带来的内存浪费,适合大多数场景。

方案2:合并后排序再哈希

如果需要关注两个字符串合并后的整体字符集合(不管各自内部顺序),可以把拼接后的字符串先排序,再计算哈希——排序后abczyx和zyxabc都会变成abcxyz,哈希结果自然相同。

代码示例:

function sortedHash(strA, strB) {
  const combined = strA + strB;
  const sortedStr = combined.split('').sort().join('');
  
  let hash = 0;
  const MOD = 1000000007;
  for (const char of sortedStr) {
    hash = (hash * 31 + char.charCodeAt(0)) % MOD;
  }
  return hash;
}

// 测试验证
const str1 = "abc";
const str2 = "zyx";
const hash1 = sortedHash(str1, str2);
const hash2 = sortedHash(str2, str1);
console.log(hash1 === hash2); // 输出 true

注意:排序会带来额外时间开销,长字符串场景下性能不如方案1。

额外提示

  • 基础哈希函数尽量选低碰撞概率的实现,比如用大质数取模,或者结合多个质数运算;如果对安全性要求高,也可以用SHA-256这类加密哈希(但性能会下降)。
  • 要是需要处理多个字符串的拼接顺序忽略,直接把所有字符串的哈希值用交换律运算组合即可(比如累加所有哈希值)。

内容的提问来源于stack exchange,提问作者bel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 00:04:51