파이썬 객체에서 캐시 키를 만드는 방법

14505 단어 python
Python 개체에 대해 일관된 키가 필요할 때 자주 사용하는 키hashlib.md5 그것은 나와 내가 가진 사용 사례에 적합합니다.

디스크캐시



어제 우리는 python diskcache를 사용하여 영구 캐시를 설정하는 방법에 대해 이야기했습니다. 이것이 실제로 작동하게 하려면 일종의 파이썬 개체에서 일관된 캐시 키를 만드는 좋은 방법이 필요합니다.


article cover for <br>
 How I setup a sqlite cache in python<br>


How I setup a sqlite cache in python




해시시



작동하지 않습니다

내 첫 번째 생각은 파일을 해시하는 것이었습니다. 이렇게 하면 각각에 대해 고유한 키가 제공됩니다. 이것은 작동하고 하나의 주어진 파이썬 프로세스에 대해 일관된 키를 제공합니다. 새 통역사를 시작하면 다른 키를 얻게 됩니다.

waylonwalker.com on  main [$✘!?] via  v5.1.5  v3.8.0 (waylonwalker.com)
 ipython

waylonwalker main v3.8.0 ipython
 hash("waylonwalker")
-3862245013515310359

waylonwalker main v3.8.0 ipython
 hash("waylonwalker")
-3862245013515310359

waylonwalker main v3.8.0 ipython
 exit

waylonwalker.com on  main [$✘!?] via  v5.1.5  v3.8.0 (waylonwalker.com)
 ipython


waylonwalker main v3.8.0 ipython
 hash("waylonwalker")
-83673051278873734



here is a snapshot of my terminal proving that you can get the same hash in one session, but it changes when you restart ipython.



hashlib.md5



다음은 md5 캐시가 여러 세션에서 일관됨을 보여주는 몇 가지 ipython 세션입니다.

waylonwalker.com on  main [$✘!?] via  v5.1.5  v3.8.0 (waylonwalker.com) on  (us-east-1)
 ipython

waylonwalker main v3.8.0 ipython
 hashlib.md5("waylonwalker")
[PYFLYBY] import hashlib
╭─────────────────────────────── Traceback (most recent call last) ────────────────────────────────╮
 <ipython-input-1-1537c4473c74>:1 in <module>                                                     
╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
TypeError: Unicode-objects must be encoded before hashing

waylonwalker main v3.8.0 ipython
 hashlib.md5("waylonwalker".encode("utf-8"))
<md5 HASH object @ 0x7fe4ba6832d0>

waylonwalker main v3.8.0 ipython
 hashlib.md5("waylonwalker".encode("utf-8")).hexdigest()
'1c7c1073ca096ffdb324471770911fe2'

waylonwalker main v3.8.0 ipython
 hashlib.md5("waylonwalker".encode("utf-8")).hexdigest()
'1c7c1073ca096ffdb324471770911fe2'

waylonwalker main v3.8.0 ipython
 hashlib.md5("waylonwalker".encode("utf-8")).hexdigest()
'1c7c1073ca096ffdb324471770911fe2'

waylonwalker main v3.8.0 ipython
 exit


waylonwalker.com on  main [$✘!?] via  v5.1.5  v3.8.0 (waylonwalker.com) on  (us-east-1) took 47s
 ipython

waylonwalker main v3.8.0 ipython
 hashlib.md5("waylonwalker".encode("utf-8")).hexdigest()
[PYFLYBY] import hashlib
'1c7c1073ca096ffdb324471770911fe2'




디스크 캐시용 키



일관성이 있기 때문에 디스크 캐시 작업을 위한 캐시 키로 사용할 수 있습니다. 여러 가지 다른 것들을 캐시에 전달할 수 있는 작은 기능을 설정했습니다. str 메소드가 존재하고 키를 캐시하려는 데이터를 제공하는 한 작동합니다.

def make_hash(self, *keys: str) -> str:
    str_keys = [str(key) for key in keys]
    return hashlib.md5("".join(str_keys).encode("utf-8")).hexdigest()






understanding python *args and **kwargs





If the args is confusing, I have a full article on *args and `*kwargs`.


직접 확인하세요



여기에서 작동하는 것을 볼 수 있습니다. 함수에 전달된 모든 것이 키의 일부가 됩니다.

waylonwalker ↪main v3.8.0 ipython
❯ def make_hash(self, *keys: str) -> str:
...:     str_keys = [str(key) for key in keys]
...:     return hashlib.md5("".join(str_keys).encode("utf-8")).hexdigest()
...:

waylonwalker ↪main v3.8.0 ipython
❯ make_hash(1, "one", "1", 1.0)
'73901d019df012a1cdab826ce301217d'

waylonwalker ↪main v3.8.0 ipython
❯ exit


waylonwalker.com on  main [$✘!?] via  v5.1.5  v3.8.0 (waylonwalker.com) on  (us-east-1) took 19m19s
❯

waylonwalker.com on  main [$✘!?] via  v5.1.5  v3.8.0 (waylonwalker.com) on  (us-east-1)
❯ ipython

waylonwalker ↪main v3.8.0 ipython
❯ def make_hash(self, *keys: str) -> str:
...:     str_keys = [str(key) for key in keys]
...:     return hashlib.md5("".join(str_keys).encode("utf-8")).hexdigest()
[PYFLYBY] import hashlib

waylonwalker ↪main v3.8.0 ipython
❯ make_hash(1, "one", "1", 1.0)
'73901d019df012a1cdab826ce301217d'

좋은 웹페이지 즐겨찾기