2

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

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

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

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

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

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

4

1 回答 1

3

据我了解,您正在寻找一种为您的文档生成简短、唯一、字母数字标识符的方法。URL 缩短器所做的事情(请参阅问题制作类似于 TinyURL.com 的短 URL创建短哈希的最佳方法是什么,类似于 tiny Url 的功能?如何使用 Python 制作独特的短 URL?等。 )。我的回答是基于这个假设。

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

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

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

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

如果可预测性是一个问题,您可以为这个字母数字 ID 加上一些随机字符的前缀/后缀。

于 2013-04-10T21:34:50.727 回答