-
-
Save risent/4cab3878d995bec7d1c2 to your computer and use it in GitHub Desktop.
| import random | |
| import time | |
| import numpy | |
| from exceptions import ValueError | |
| class PushID(object): | |
| # Modeled after base64 web-safe chars, but ordered by ASCII. | |
| PUSH_CHARS = ('-0123456789' | |
| 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' | |
| '_abcdefghijklmnopqrstuvwxyz') | |
| def __init__(self): | |
| # Timestamp of last push, used to prevent local collisions if you | |
| # pushtwice in one ms. | |
| self.lastPushTime = 0 | |
| # We generate 72-bits of randomness which get turned into 12 | |
| # characters and appended to the timestamp to prevent | |
| # collisions with other clients. We store the last characters | |
| # we generated because in the event of a collision, we'll use | |
| # those same characters except "incremented" by one. | |
| self.lastRandChars = numpy.empty(12, dtype=int) | |
| def next_id(self): | |
| now = int(time.time() * 1000) | |
| duplicateTime = (now == self.lastPushTime) | |
| self.lastPushTime = now | |
| timeStampChars = numpy.empty(8, dtype=str) | |
| for i in range(7, -1, -1): | |
| timeStampChars[i] = self.PUSH_CHARS[now % 64] | |
| now = int(now / 64) | |
| if (now != 0): | |
| raise ValueError('We should have converted the entire timestamp.') | |
| uid = ''.join(timeStampChars) | |
| if not duplicateTime: | |
| for i in range(12): | |
| self.lastRandChars[i] = int(random.random() * 64) | |
| else: | |
| # If the timestamp hasn't changed since last push, use the | |
| # same random number, except incremented by 1. | |
| for i in range(11, -1, -1): | |
| if self.lastRandChars[i] == 63: | |
| self.lastRandChars[i] = 0 | |
| else: | |
| break | |
| self.lastRandChars[i] += 1 | |
| for i in range(12): | |
| uid += self.PUSH_CHARS[self.lastRandChars[i]] | |
| if len(uid) != 20: | |
| raise ValueError('Length should be 20.') | |
| return uid |
thank you very much...i was in confusion.
thank you for the python script @risent. I am very new to python and I can't seem to call the PushID class correctly.
I am trying to generate a UID for each row in 'full_results_date.csv' and re-write the rows to a new csv 'results_uid.csv' with the uid of each row appended in the new column.
I have added the following code below your script.
`with open('full_results_date.csv', 'r') as csvinput:
with open('results_uid.csv', 'w') as csvoutput:
writer = csv.writer(csvoutput, lineterminator='\n')
reader = csv.reader(csvinput)
all = []
row = next(reader)
row.append(PushID())
all.append(row)
for row in reader:
row.append(PushID())
all.append(row)
writer.writerows(all)`
the 'results_uid.csv' has a column appended but each cell in the column is not a UID. Instead, the object location is being returned -
<main.PushID object at 0x109727518>
Thanks man. It was very helpful
import firebase_pushid
print(firebase_pushid.PushID().next_id())
had to remove line 4 to have it work on python 3.8.10
Great job on the python port @risent! Why is the
elsehere necessary though?Edit: Figured it out. Again, thanks for this!