库在C/C++和其他语言中重现Java原语hashCode逻辑

Library to reproduce the Java primitives hashCode logic in C / C++ and other languages

本文关键字:Java 原语 逻辑 hashCode 语言 C++ 其他 库在      更新时间:2023-10-16

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

  • 我在 Java 中有一个字符串 = "abcde12345"
  • 我们假设它在 Java 中的哈希码是"78911"
  • 我在 C 程序中有一个字符串 = "abcde12345"

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


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

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

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


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


编辑:为吉姆·巴尔

我的用例是:

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

例如,如果我有 113 个存储桶(这是 gemfire 中的默认存储桶数),并且我的映射键是字符串"键"

"Key".hashCode() % 113 = 69

因此,GemFire 知道"密钥"属于第 69n 个存储桶。

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

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

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

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

将来,我可能需要对带有 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 或规范并自己实现它,但由于我的目标是大量语言并且我不知道如何用每种语言编写代码,我希望有人为我做这件事并在开源中提供,免费使用的项目!

我想

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

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

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

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

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

对于 Java 以外的语言,如果该语言没有指定哈希算法(Java 这样做是不寻常的),那么即使您可以确定哈希算法,也无法确定哈希算法不会更改。我怀疑你实际上并不需要你声称你需要的东西,但你必须更多地谈论你的要求(而不是你认为可以解决它们的东西)。