Skip to content

Commit

Permalink
Do not use easily-misread glyphs in Firestore auto-IDs. (#4107)
Browse files Browse the repository at this point in the history
* Do not use easily-misread glyphs in auto-IDs.

* Updating from 20 to 21 auto-id chars.

This way the entropy is preserved after dropping the alphabet
from 62 to 55 characters:

  >>> (62. / 55.)**20
  10.979435205204474
  >>> 55**20 < 62**20 < 55**21
  True
  • Loading branch information
dhermes authored and chemelnucfin committed Dec 13, 2017
1 parent 83d280a commit 8715da9
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 8 deletions.
11 changes: 5 additions & 6 deletions google/cloud/firestore_v1beta1/collection.py
Expand Up @@ -24,8 +24,7 @@
from google.cloud.firestore_v1beta1.proto import document_pb2


_AUTO_ID_CHARS = (
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789')
_AUTO_ID_CHARS = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghjkmnpqrstuvwxyz23456789'


class CollectionReference(object):
Expand Down Expand Up @@ -93,7 +92,7 @@ def document(self, document_id=None):
Args:
document_id (Optional[str]): The document identifier
within the current collection. If not provided, will default
to a random 20 character string composed of digits,
to a random 21 character string composed of digits,
uppercase and lowercase and letters.
Returns:
Expand Down Expand Up @@ -139,7 +138,7 @@ def add(self, document_data, document_id=None):
document_id (Optional[str]): The document identifier within the
current collection. If not provided, an ID will be
automatically assigned by the server (the assigned ID will be
a random 20 character string composed of digits,
a random 21 character string composed of digits,
uppercase and lowercase letters).
Returns:
Expand Down Expand Up @@ -376,8 +375,8 @@ def _auto_id():
"""Generate a "random" automatically generated ID.
Returns:
str: A 20 character string composed of digits, uppercase and
str: A 21 character string composed of digits, uppercase and
lowercase and letters.
"""
return ''.join(
random.choice(_AUTO_ID_CHARS) for _ in six.moves.xrange(20))
random.choice(_AUTO_ID_CHARS) for _ in six.moves.xrange(21))
4 changes: 2 additions & 2 deletions tests/unit/test_collection.py
Expand Up @@ -427,12 +427,12 @@ def _call_fut():
def test_it(self, mock_rand_choice):
from google.cloud.firestore_v1beta1.collection import _AUTO_ID_CHARS

mock_result = '0123456789abcdefghij'
mock_result = '23456789abcdefghjkmnp'
mock_rand_choice.side_effect = list(mock_result)
result = self._call_fut()
self.assertEqual(result, mock_result)

mock_calls = [mock.call(_AUTO_ID_CHARS)] * 20
mock_calls = [mock.call(_AUTO_ID_CHARS)] * 21
self.assertEqual(mock_rand_choice.mock_calls, mock_calls)


Expand Down

0 comments on commit 8715da9

Please sign in to comment.