【问题标题】:Generating Hash codes with Google App Engine (GAE)使用 Google App Engine (GAE) 生成哈希码
【发布时间】:2013-03-31 10:45:15
【问题描述】:

我需要设计一种方法来为存储在我的应用程序中的每个文档提供哈希。

使用现有的哈希库(BCrypt 等)甚至 BSON ObjectId 会生成不错的“哈希”或“密钥”,但它很长。

我也明白,实现短散列的唯一方法是散列更少的字符串(如果没有记错的话)。像哈希Long id 从0, 1, 2, 3 盯着等等。

然而这很容易想到,在 Google App Engine (GAE) 数据存储区中实现它相当困难,或者直到现在我还没有真正满足这个需求。

GAE 数据存储跨服务器甚至跨数据中心存储实体,并且自动递增 ID 并非真正用于此目的。

实现这一目标的策略是什么?

【问题讨论】:

  • 1.一些像 md5 和 sha1 这样的哈希库总是会产生相同的长度 2。你为什么想要短哈希?
  • 如果 GAE 数据存储擅长 ID 自动递增,MD5 就可以了
  • 你错了。消息摘要算法将任意长度的字节数组作为输入,并返回一个固定长度的字节数组作为输出(通常约为 16 或 20 个字节)

标签: java google-app-engine hash google-cloud-datastore


【解决方案1】:

据我了解,您正在寻找一种方法来为您的文档生成简短、唯一的字母数字标识符。 URL 缩短器所做的事情(请参阅问题 Making a short URL similar to TinyURL.comWhat's the best way to create a short hash, similiar to what tiny Url does?How to make unique short URL with Python? 等)。我的回答是基于这个假设。

数据存储区会生成唯一的自动递增 ID,因此您可以依赖它。多个数据中心不是问题,您的 ID 将是唯一的、短的(至少最初是这样)并且不会发生冲突。这可能就是 tinyurl 和类似服务的实现方式。

您甚至可以使用DatastoreService.allocateIds() 将新文档保存在数据存储区之前请求一个或多个唯一 ID,例如:

KeyRange keyRange = dataService.allocateIds("MyDocumentModel", 1);
long uniqueId = keyRange.getStart().getId();

然后您可以“散列”此 ID,或者您可以通过简单地将整数 ID 转码为 Base64(或 Base36 或您定义自己的字符的其他基数,例如,省略元音可以帮助您避免不小心产生明显的脏话)。

如果可预测性是一个问题,您可以在此字母数字 ID 前加上一些随机字符。

【讨论】:

  • 是的,这正是我真正想要做的。但是,当您说自动增量时?您是说使用 JDO 还是 Objectify 时?因为创建原始实体需要使用 kind + 组合键
  • 例如,AdminDatastoreService.allocateIds("MyKind", 5) 为您提供由数据存储区为 MyKind 模型生成的接下来的 5 个唯一键。在这些键中,有唯一的整数 ID。
  • 您说的是唯一整数 ID,但是 ID 不够唯一对,真正的唯一键是 Datastore 键本身,对吗?
  • 数据存储正在为每个模型生成自动递增的唯一 ID。对于您的应用程序在所有实例中的该模型,此整数 ID 保证是唯一的。因此,如果您始终为此特定模型使用整数 ID(例如,MyDocumentModel),那么整个密钥将是唯一的。我在自己的应用程序中使用了相同的技术。
猜你喜欢
  • 2011-01-04
  • 2014-06-05
  • 2012-09-11
  • 2013-07-15
  • 1970-01-01
  • 2011-03-11
  • 2020-10-21
  • 2015-05-12
  • 1970-01-01
相关资源
最近更新 更多