ฟังก์ชั่นที่กระจายอินพุต


14

ฉันต้องการทราบว่ามีฟังก์ชันจากหมายเลข n-bit ไปยังหมายเลข n-bit ที่มีคุณสมบัติดังต่อไปนี้หรือไม่:f

  • fควรเป็น bijective
  • ทั้งและน่าจะคำนวณได้อย่างรวดเร็วff1
  • fควรคืนค่าตัวเลขที่ไม่มีความสัมพันธ์อย่างมีนัยสำคัญกับอินพุต

เหตุผลคือ:

ฉันต้องการเขียนโปรแกรมที่ทำงานกับข้อมูล ข้อมูลบางส่วนของข้อมูลจะถูกเก็บไว้ในแผนผังการค้นหาแบบไบนารี่โดยที่คีย์การค้นหาเป็นสัญลักษณ์ของตัวอักษร เมื่อเวลาผ่านไปฉันจะเพิ่มสัญลักษณ์เพิ่มเติมให้กับตัวอักษร สัญลักษณ์ใหม่จะได้รับหมายเลขฟรีต่อไป ดังนั้นต้นไม้จะมีอคติเล็ก ๆ น้อย ๆ กับคีย์ที่เล็กกว่าซึ่งทำให้เกิดการปรับสมดุลมากกว่าที่ฉันคิดว่าควรจะต้องการ

ความคิดของฉันคือการฉีกตัวเลขสัญลักษณ์ที่มีเช่นที่พวกเขามีการแพร่กระจายอย่างกว้างขวางไปทั่วทั้งช่วงของ-1] เนื่องจากหมายเลขสัญลักษณ์มีความสำคัญเฉพาะในระหว่างอินพุตและเอาต์พุตที่เกิดขึ้นเพียงครั้งเดียวการใช้ฟังก์ชันดังกล่าวจึงไม่ควรแพงเกินไปf[0,2641]

ฉันคิดเกี่ยวกับการวนซ้ำของตัวสร้างตัวเลขสุ่ม Xorshift หนึ่งครั้ง แต่ฉันไม่รู้วิธีการยกเลิกมันจริงๆแม้ว่ามันจะเป็นไปได้ในทางทฤษฎี

ใครรู้ฟังก์ชั่นดังกล่าวหรือไม่?
นี่เป็นความคิดที่ดีหรือไม่?


1
ฉันไม่ได้เป็นผู้เชี่ยวชาญ แต่บางทีคุณสามารถใช้การเปลี่ยนแปลง pseudorandom (ดูตัวอย่างการเข้ารหัส Feistel )
Vor

หากคุณกำลังคำนวณฟังก์ชันแฮชเป็นหลักทำไมไม่ใช้การแฮช
vonbrand

@vonbrand Hashing ไม่สามารถย้อนกลับได้ ดูข้อกำหนดจำนวน 2
FUZxxl

ทำไมต้องย้อนกลับได้? มีอะไรผิดปกติกับการทำให้มันสามารถย้อนกลับได้โดยการค้นหา?
vonbrand

1
คุณสามารถเก็บ (f (x), x) เป็นปุ่มได้
adrianN

คำตอบ:


6

คุณสามารถใช้Fibonacci hashingคือ

hF(k)=k512k512

สำหรับคุณจะได้รับnหมายเลขคู่-ที่แตกต่างกัน (ประมาณ) แพร่กระจายอย่างสม่ำเสมอใน[ 0 , 1 ] ด้วยการปรับเป็น[ 1 .. M ]และการปัดเศษ (ลง) คุณจะได้ตัวเลขที่กระจายอย่างสม่ำเสมอในช่วงเวลานั้นk=1,,nn[0,1][1..M]

ตัวอย่างเช่นค่าเหล่านี้คือสเกลเป็น[ 0..10000 ] (ลำดับเดิมซ้ายเรียงลำดับขวา):hF(1),,hF(200)[0..10000]

ป้อนคำอธิบายรูปภาพที่นี่

นี่เป็นตัวอย่างของสิ่งที่ Knuth เรียกใช้การแฮ็กแบบหลายค่า สำหรับขนาดคำคอมพิวเตอร์จำนวนเต็มความสำคัญกับบางWและMจำนวนที่อยู่ที่จำเป็นที่เราจะใช้wAwM

h(k)=M((kAw)mod1)

ฟังก์ชั่นคร่ำเครียด ด้านบนตามด้วย (ตรวจสอบให้แน่ใจว่าคุณสามารถคำนวณด้วยความแม่นยำเพียงพอ) ขณะนี้ยังใช้งานได้กับจำนวนอตรรกยะอื่น ๆ นอกเหนือจากϕ-1มันเป็นหนึ่งในสองตัวเลขเท่านั้นที่นำไปสู่หมายเลข "กระจายอย่างสม่ำเสมอที่สุด"A/w=ϕ1=512ϕ1

ค้นหาเพิ่มเติมในThe Art of Computer Programmingเล่มที่ 3 โดย Donald Knuth (บทที่ 6.4 จากหน้า 513 ในรุ่นที่สอง) โดยเฉพาะอย่างยิ่งที่คุณจะพบว่าทำไมตัวเลขที่เกิดขึ้นเป็นคู่ที่แตกต่างกัน (อย่างน้อยถ้า ) และวิธีการคำนวณฟังก์ชันผกผันถ้าคุณใช้ธรรมชาติและWแทนφ - 1nMAwϕ1


1
วิธีการคำนวณอย่างมีประสิทธิภาพ? f1
frafl

1
@frafl ฉันหวังว่าการแก้ไขของฉันจะตอบข้อกังวลของคุณบ้าง เป็นที่ชัดเจนว่าเทคนิคการแฮ็กเหล่านี้ไม่ได้ถูกออกแบบมาเป็นพิเศษเพื่อให้สามารถย้อนกลับได้อย่างมีประสิทธิภาพ
กราฟิลส์

ใช่ฉันจะลงคะแนน แต่ฉันจะไม่แนะนำเป็นคำตอบที่ยอมรับได้
frafl

1

สำหรับอินพุต -bit ฟังก์ชันนี้ทำงาน:k

hash(n)=(nmod2k2)2k2+ndiv2k2

hash(hash(n))=n{n,m},n<mhash(m)<hash(n){1,,2k21}

Ref: ฟังก์ชันแฮชแบบย้อนกลับได้


มันดูเรียบง่ายและดูดี ฉันจะทดสอบอันนั้น
FUZxxl

1
1ρ

มันค่อนข้างชัดเจน! สำหรับ 64- บิต (0x00000000FFFFFFFF) และคุณควรเลื่อน (<<) 32 บิต ฟังก์ชั่นนี้เรียบง่ายใช้งานได้จริงและเร็วพอในทางปฏิบัติ
Reza

1
x{1,,2321}232x
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.