2

我想知道是否有一个多语言库或允许给我以下结果的东西:

  • 我在 Java 中有一个 String = "Abcde12345"
  • 我们假设它在 Java 中的 hashcode 是“78911”
  • 我在 C 程序中有一个 String = "Abcde12345"

我想知道的是:如何在我的 C 程序中轻松获取哈希码 78911?由于每种语言都可以为字符串提供自己的哈希算法,我该如何处理呢?


我在使用分布式哈希表(数据网格、分布式缓存、NoSQL ......)的背景下问这个问题。我计划为 Java 专有数据网格创建类似于 C 中非常简单的客户端的东西。

这是我现在的用例,但对于我的项目,我需要一个与多种语言兼容的哈希算法: - Ruby 中的 Java 哈希算法 - Java 中的 C# 哈希算法 - Java 中的 C++ 哈希算法 - C++ 中的 Java 哈希算法 - Java 哈希Erlang 中的算法无论如何,两种语言中两种算法的哈希都需要产生完全相同的哈希值。

如果可能的话,我想将这个概念扩展到原始类型和“简单结构”,而不仅仅是字符串


有谁知道任何工具来处理我的用例?


编辑:吉姆·巴尔特

我的用例是:

我有一个名为 GemFire 的专有分区/数据网格技术,用 Java 编写。它充当分布式哈希图。哈希图中的桶数是固定的。对于每个映射键,它计算其哈希码,并应用一个模数,以便它知道每个键到它所属的每个桶。

例如,如果我有 113 个桶(这是 gemfire 中的默认桶数),我的地图键是字符串“键”

"Key".hashCode() % 113 = 69

因此 GemFire 知道“Key”属于第 69 个桶。

现在我有一个 C 应用程序:

  • 此应用程序已经知道 Gemfire (113) 使用的存储桶数量。
  • 对于任何随机密钥,此应用程序需要能够计算 GemFire 将放置该随机密钥的桶号。
  • 这个应用程序需要能够快速计算它,我们不能使用网络服务。
  • 这个应用程序应该很容易部署,而且我在 C/Java 之间没有任何桥接技术——这需要安装 JVM 来运行 C 应用程序

因此,如果您知道如何做到这一点而不必在 C 中编写/使用 Java 哈希码端口,请告诉我。

编辑:为了避免混淆:我不是在寻找其他任何东西,但吉姆巴尔特你建议我不需要我声称需要的东西所以告诉我你是否看到任何其他解决方案,除了像你说的那样使用自定义或流行的哈希算法。

将来我可能需要对带有 C# 客户端应用程序和其他语言的 Erlang 分区应用程序做同样的事情!


编辑:我想避免使用非 java 哈希算法(正如有人建议使用 md5/sha1 或任何更快的非面向安全的哈希算法)。这是因为我的解决方案旨在部署在通常用 Java 编写的遗留分布式系统上,这些系统已经包含大量数据,并且哈希算法的任何更改都需要大量的数据迁移过程。但是,我牢记这个解决方案,因为对于从头开始新的分布式系统或准备进行数据迁移的人们来说,它可能是一个不错的第二选择。


所以最后,我要找的不是有人告诉我用 C 实现 Java 字符串哈希算法,我已经知道我可以做到,谢谢!我想知道是否有人已经这样做了,不仅是为了用 C 实现所有原始的 java 算法,而且还用其他语言和其他语言实现!!!我正在寻找一个多语言库,为其他语言提供哈希算法的端口。

因此,如果地球上只有 3 种语言(C、Java 和 Python),我的问题是:是否有任何多语言库提供:

  • C 中的 Java 哈希端口
  • Python 中的 Java 哈希端口
  • Java中的C哈希端口
  • Python 中的 C 哈希端口
  • Java 中的 Python 哈希端口
  • C 中 Python 哈希的一个端口

对于所有可用的原始类型,以及最终的基本结构。如果对于给定的语言没有“默认哈希算法”,那么最广泛使用的可以被认为是语言算法。

你明白我的意思吗?我想知道有没有图书馆!我知道我可以查看 JDK 或规范并自己实现它,但是由于我的目标是大量语言并且我不知道如何用每种语言编写代码,所以我希望有人这样做对我来说,并在一个开源、免费使用的项目中提供!

4

2 回答 2

1

我要补充一点,您可以浏览 OpenJDK 的源代码并查看 hashCode 实现。但是,请记住,正如 Jim Garrison 建议的评论所建议的那样,不同的类可能会覆盖 hashCode,因此您必须遵循实现。我建议对字符串执行散列以使用众所周知的散列函数,例如 sha-1 或 md5 - 您可以在 Java、C/C++ 和其他编程语言中找到实现。

于 2012-06-19T17:15:20.977 回答
0

计算 Java 字符串的哈希码的算法非常简单,并且作为公共规范的一部分进行了记录:http: //docs.oracle.com/javase/1.4.2/docs/api/java/lang/String。 html#hashCode ()

String 对象的哈希码计算为 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

使用 int 算术,其中 s[i] 是字符串的第 i 个字符,n 是字符串的长度,^ 表示求幂。(空字符串的哈希值为零。)

还要注意 String 是一个 final 类,所以它的方法不能被覆盖;因此,您可以保证给定的算法对于任何 Java 字符串都是正确的。

对于 Java 以外的语言,如果该语言没有指定散列算法(Java 不常这样做),那么即使可以确定散列算法也不能确定不会改变。我怀疑您实际上并不需要您声称需要的东西,但是您必须更多地说明您的要求(而不是您认为会解决这些要求的内容)。

于 2012-06-19T17:31:58.097 回答