2015-12-17 6 views
9

Chciałbym połączyć polecenie, które wydrukuje ciąg 32 cyfr szesnastkowych. Mam skrypt Pythona, który działa:Jak uzyskać losowy ciąg 32 cyfr szesnastkowych za pomocą wiersza poleceń?

python -c 'import random ; print "".join(map(lambda t: format(t, "02X"), [random.randrange(256) for x in range(16)]))' 

ten generuje moc takiego:

6EF6B30F9E557F948C402C89002C7C8A 

co jest, co mi potrzeba.

Na komputerze Mac, mogę nawet to zrobić:

uuidgen | tr -d '-' 

Jednak nie mam dostępu do bardziej wyrafinowanych języków skryptowych Ruby i Python, i nie będę na Macu (tak nie uuidgen). Muszę trzymać się bardziej bashowych narzędzi, takich jak sed, awk,/dev/random, ponieważ jestem na ograniczonej platformie. Czy jest jakiś sposób na zrobienie tego?

+2

"głowa -c16 Biffen

Odpowiedz

21

Jeśli masz hexdump następnie:

hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random 

powinno załatwić sprawę.

Objaśnienie:

  • -n 16 spożywać 16 bajtów wejściowych (32 cyfry hex = 16 bajtów).
  • iterować cztery razy, zużywać 4 bajty na iterację i wydrukować odpowiednią 32-bitową wartość w postaci 8 cyfr szesnastkowych, z zerami wiodącymi, jeśli to konieczne.
  • 1 "\n" na koniec pojedynczym znakiem nowej linii.
+1

Dobrze. A '% 08X' jest jeszcze lepsze, jeśli dokładnie 32 cyfry szesnastkowe są potrzebne, gdy są wiodące zera. Odpowiednio zmodyfikowałem swoją odpowiedź. –

+0

Jeszcze lepiej. Znowu przegrałbym, gdybym mógł. – Biffen

+0

@Renauld_Pacalet Jak byłbym w stanie zrobić to samo i stworzyć 32-cyfrowy sześciokąt w ten sposób z kodu Pythona. Kiedy robię to na linii poleceń, działa szybko 1 raz, po czym z jakiegoś powodu trwa to 30 sekund lub dłużej. –

4

Istnieją trzy sposoby, które znam:

#!/bin/bash 

n=16 

# Read n bytes from urandom (in hex): 
xxd -l "$n" -p     /dev/urandom | tr -d " \n" ; echo 
od -vN "$n" -An -tx1    /dev/urandom | tr -d " \n" ; echo 
hexdump -vn "$n" -e ' /1 "%02x"' /dev/urandom ; echo 

Użyj jednej, Wykomentuj dwóch pozostałych.

+0

W moim doświadczeniu 'od' jest najczęstszym. MacOS miał 'hexdump',' xdd' i 'od'. Git Bash (MinGW) miał 'xxd' i' od'. Obraz Dockera oparty na Alpine Linux miał 'od' (i' tr' oczywiście). Wszystkie trzy platformy miały '/ dev/urandom'. Więc jeśli szukasz najbardziej przenośnego, trzymaj się smaku "od". –

Powiązane problemy