使用Google App Engine(GAE)生成哈希代码的java
我需要设计一种方法,为存储在应用程序中的每个文档提供哈希
使用现有的散列库(BCrypt
,等等)甚至BSONObjectId
都会生成很好的“散列”或“键”,但它相当长
我也明白,实现短哈希的唯一方法是哈希更少的字符串(如果没有弄错的话)。比如hashLong
id从0, 1, 2, 3
开始等等
然而,很容易想到的是,在谷歌应用程序引擎(GAE)数据存储中实现它相当困难,或者直到现在我还没有真正跨越这一需求
GAE数据存储跨服务器甚至跨数据中心存储实体,而auto increment ID实际上并不适用于此
实现这一目标的战略是什么
# 1 楼答案
据我所知,您正在寻找一种为您的文档生成简短、唯一、字母数字标识符的方法。URL缩短器所做的事情(参见问题Making a short URL similar to TinyURL.com或What'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,例如:
然后,您可以“散列”此ID,或者只需将整数ID转换为Base64(或Base36或定义自己字符的其他基数,例如,省略元音可以帮助您避免意外生成明显的脏话),就可以获得更短的字母数字ID
如果存在可预测性问题,您可以使用一些随机字符作为该字母数字ID的前缀/后缀